摘要: 搜索总是让我难堪,递归的细节让我头脑混乱....真要好好把搜索过一遍这道题比较水,不过状态不好,修改很久才AC。#include <stdio.h>#include <stdlib.h>#include <string.h>#define N 1000#define M 30char ch[N][M];int visited[N],n;int cmp(const void *a, const void *b){ char *c = (char *) a; char *d = (char *) b; return strcmp(c,d);}int DFS_Vi 阅读全文
posted @ 2011-08-15 21:09 Veegin 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 与背包算法一样,这算法也是一个非对称算法。这里不写证明之类的定理推论了,需要的话网上可以搜到到很多,书本例如算法导论也有详细的证明。简写一下算法的步骤:•(1)选择两个大素数P、Q ,其中P!=Q(这里使用 Miller_Rabin近似算法 确定素数)(2)计算N=P*Q (3)选择一个小奇数作为公钥(加密密钥)E,使其与(P-1)*(Q-1)互质(使用 扩展欧几里德算法 求出)(4)选择私钥(解密密钥)D,满足如下条件: (D*E) mod (P-1)(Q-1)=1(使用 扩展欧几里德Extend_Euclid(E,(P-1)*(Q-1))=1,求E的逆元,即为D)(5)加密时,明文PT计算 阅读全文
posted @ 2011-08-11 19:13 Veegin 阅读(2531) 评论(0) 推荐(0) 编辑
摘要: 这是一个非对称算法,即可生成多个不同的公钥,分发给其他人,然后其他人用各自的公钥加密文件,而算法只生成一个私钥(自己保存),这私钥可解密不同公钥加密的文件。在不知道私钥的前提下,破解文件是一个NP难问题。下面贴上高老师的讲义:1.背包算法基于背包问题的简化版,即子集和问题(Subset sum)。2.子集和问题:给定一个整数集A(俗称为背包)和整数b,要求找出A的一个子集,使得其中元素之和等于b。3.子集和问题是NP完全问题。然而若集合A是一个超级增长序列(Superincreasing),则可以使用简单的贪婪策略在多项式时间求解。4.超级增长序列指集合中后一个元素大于前面所有元素之和。如 { 阅读全文
posted @ 2011-08-08 10:22 Veegin 阅读(5528) 评论(0) 推荐(1) 编辑
摘要: 在刚接触这道题的时候,确实无从下手,因为我记得高老师说过01背包算法并不是一个好算法,时间复杂度是指数级。这题容量为实数时,更是无法直接解决。参考了一下别人的思路,发现原来可以把银行总存款作为背包容量,把被抓率转换成逃脱率(即1-被抓率)作为背包物件的价值,进行动态01决策。求出比最低逃脱率大的第一个逃脱率,这时的偷得的存款即为最大可偷的存款。代码如下://以总资产为容量,以逃脱率为价值,DP求出第一个比最低逃脱率大的最大偷钱数目#include <stdio.h>#define M 100050#define N 150double C[M],r[N];//r[N]为逃脱率,w[ 阅读全文
posted @ 2011-08-02 21:03 Veegin 阅读(536) 评论(0) 推荐(0) 编辑
摘要: 一直都在个人苦攻,感觉进度很慢很慢,受的打击也不少。终于在今个暑假,我们争取到了首次的暑假集训,实在是相当来之不易啊。 为期5个多星期的集训,已经过去一半了,高老师的讲课也完结了。高老师的课含金量很高!大部分的基础算法算是通学了一遍。这东西要自学真不知道要什么时候才能学完。现在有了点基础,就能走得更远了。很感谢高老师对我们ACM学习的大力支持,谢谢老师!当然,王书记也很重视我们的ACM学业,没了王书记,这次集训不可能搞得起来。 在这里总结一下,一共是学了如下算法排序与顺序统计合并排序(分治) 快速排序动态规划贪心算法图算法-DFS和BFS图算法-强连通分量图算法-最短路径-Dijstra、B. 阅读全文
posted @ 2011-08-01 18:59 Veegin 阅读(493) 评论(1) 推荐(1) 编辑
摘要: 集训期间学会了动态规划的01背包,想去刷几道水题看看代码有没有问题,没想到遇到POJ3624,我原来的二维背包因为数据太大而不能AC,然后我到网上查看一下别人的方法,才看见,背包问题可以用一维!仔细想一下,对啊,这道题,用一维数组更新其值就可以了。于是重写代码,AC。代码如下:#include <stdio.h>#include <string.h>#define N 3500#define M 13000int d[N],w[N],val[M],n,W;void knapsack(){ int i,j; memset(val,0,sizeof(val)); for(i 阅读全文
posted @ 2011-08-01 17:34 Veegin 阅读(2447) 评论(0) 推荐(0) 编辑
摘要: 看了几天关于最大流的书,今天找一道最经典的最大流题目hdoj1532,跟poj1273一样的题目,起初WA了,不知道什么原因。后来在POJ的discuss看到,原来是重边的问题,对该细节疏忽了。然后把代码改了一下,AC。这里用的是增广路算法——Edmons-Karp。算法思想是,从零流(所有边的流量均为0)开始不断增加流量,保持每次增加流量后都满足容量限制、斜对称性和流量平衡3个条件。这个算法基于这样的一个事实:残量网络中任何一条从s到t的有向道路都对应一条原图中的增广路——只要求出该道路中所有残量的最小值d,把对应的所有边上的流量增加d即可,这个过程称为增广。不难验证,如果增广前的流量满足3 阅读全文
posted @ 2011-05-05 19:52 Veegin 阅读(1592) 评论(5) 推荐(0) 编辑
摘要: 博文转自:http://hi.baidu.com/hwb8/blog/item/ae3a1d600068fe48ebf8f8e2.html第一篇1001 这个就不用说了吧1002 简单的大数1003 DP经典问题,最大连续子段和1004 简单题1005 找规律(循环点)1006 感觉有点BT的题,我到现在还没过1007 经典问题,最近点对问题,用分治1008 简单题1009 贪心1010 搜索题,剪枝很关键1011 1012 简单题1013 简单题(有个小陷阱)1014 简单题1015 可以看作搜索题吧1016 经典的搜索1017 简单数学题1018 简单数学题1019 简单数学题1020 简 阅读全文
posted @ 2011-05-05 11:25 Veegin 阅读(1974) 评论(0) 推荐(1) 编辑
摘要: POJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期:一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. (4)递推. (5)构造法.(poj3295) (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法: (1)图的深度优先遍历和广度优先遍历. (2)最短路径算法(dijkstra,bellman-fo 阅读全文
posted @ 2011-05-05 11:23 Veegin 阅读(3799) 评论(0) 推荐(0) 编辑
摘要: 素数打表:void oddp(){ int i,j; for(i=0;i<1000000;i++) a[i]=1; a[0]=0; a[1]=0; for(i=2;i<1000000;i++) { if(a[i]==1) { for(j=i*2;j<1000000;j+=i) a[j]=0; } }}结合POJ2262代码:int main(){ int num; int i,flag; oddp(); while(scanf("%d",&num)!=EOF&&num!=0) { for(flag=0,i=2;i<num;i+ 阅读全文
posted @ 2011-04-29 09:59 Veegin 阅读(1723) 评论(1) 推荐(0) 编辑