摘要: 字典树的简单应用。 #include#includechar str[10100][22];struct node{ int cnt; node *next[26];}*p;void build(char str[],int k,node *head){ while(knext[str[k]-'a']!=NULL) { head->next[str[k]-'a']->cnt+=1; head=head->next[str[k]-'a']; } else { ... 阅读全文
posted @ 2013-08-23 20:15 yongren1zu 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 题意:给n个atom(原子),每两个原子相碰会产生能量,不过每次碰撞会消失一个原子,而且不同原子碰撞,消失的原子不同,产生的能量也会不同,给出不同原子相碰撞产生的能量,求出能产生的最多能量。 状态DP 状态s表示n个原子的状态。 每次碰撞只消失一个原子,最后会剩下一个原子不消失,最终的答案是max(dp[(1#include#define max(a,b) (a)>(b)?(a):(b)int n;int dp[1<<10],map[12][12];int DP(int s){ if(dp[s]!=-1) return dp[s]; for(int i=0;i<... 阅读全文
posted @ 2013-08-19 20:29 yongren1zu 阅读(106) 评论(0) 推荐(0) 编辑
摘要: 题意:有n个城市和一个披萨店(0),给出一个(n+1)阶的矩阵,表示 i 到 j 的距离,每个点可走多次。求从披萨店出发,再回到披萨店,把每个城市走一遍要走的最近距离。 状态DP,状态s二进制中第几位表示第几个城市走没走过的状态,0表示每走过,1表示走过。 先用Floyd求任意两点之间的最近距离,然后状态s从0开始到 (1#include#define min(a,b) (a)>(b)?(b):(a)const int inf = 99999999;int n;int map[15][15];int dp[1200][15];void Input(){ for(int i=0;i... 阅读全文
posted @ 2013-08-17 20:24 yongren1zu 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 状态DP主要用的还是DP思想,顾名思义,加了一个状态,主要是用来求状态个数的。 状态是用二进制数来表示的,也就是用0或1来表示,每一行有一个状态数,就是由这一行的0或1组成的,首先我们要获得每行的状态数。for(int i=0;i0) { if(x&1)num++; x>>=1; } return num; } 状态DP最主要的还是DP,上面这些都是求状态的一些代码,不是主要的。 状态DP要求不同行之间的的状态数是否满足要求,因为状态DP用二进制来表示,所以位运算用的比较多。 阅读全文
posted @ 2013-08-17 15:55 yongren1zu 阅读(111) 评论(0) 推荐(0) 编辑
摘要: 字符串DP 题意:给你三个字符串a,b,c求字符串d的长度。 字符串d满足的要求:是a和b的公共子序列,c是它的子串。 定义dp1[i][j]表示a的第 i 位与b的第 j 位之前相同的子序列长度(包括 i ,j),dp2[i][j]表示a的第 i 位与b的第 j 位之后相同的子序列长度(包括 i ,j)。 查找c的首尾字符在a 和b 的位置,求出c首字符之前a和b的公共子序列的长度以及c尾字符之后a和b的公共子序列的长度,加上c的长度即为所求。#include#include#define maxn 1010#define max(a,b) (a)>(b)?(a):(b)char... 阅读全文
posted @ 2013-08-17 14:26 yongren1zu 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 状态DP 二进制题型,用0和1来确定所有的情况。 把每一行安排的情况看成一个二进制数,如果这一行的某一列安排了一头奶牛,那么对应的二进制就是1,如果没有安排那么就是0.如果某个状态表示里出现了两个连续的1,那么这个状态永远是非法的,可以去掉,这样处理之后剩下的可能合法。 令dp[i][j]表示第i行状态为j时有多少可能的安排方法,那么状态转移方程是:如果j是合法状态:dp[i][j]=sum{dp[i-1][k]},其中满足k&j==0。 #include#include#define maxn (1=0;j--) { scanf("%d",&n... 阅读全文
posted @ 2013-08-17 14:16 yongren1zu 阅读(120) 评论(0) 推荐(0) 编辑
摘要: 解题报告:http://blog.sina.com.cn/s/blog_6635898a0100pdlu.html#includeusing namespace std;const int nMax = 405;const int eMax = 1500; struct{ int st, ed, w;}inl[nMax];struct{ int v, cap, cost, next, re;}edge[eMax];int n, ans;int k, edgeHead[nMax];int que[nMax], pre[nMax], dis[nMax];bool vis[nMax]... 阅读全文
posted @ 2013-08-16 16:53 yongren1zu 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 题意以及分析:http://ycool.com/post/zhhrrm6#rule3 主要是建图,简化图,然后在套最大流的模板。#include #include#includeusing namespace std;struct Node{ int v,cap,flow,next; Node(){} Node(int _v,int _cap,int _flow,int _next) { v=_v; cap=_cap; flow=_flow; next=_next; }};const int INF=1... 阅读全文
posted @ 2013-08-15 20:43 yongren1zu 阅读(149) 评论(0) 推荐(0) 编辑
摘要: EK算法的核心 反复寻找源点 s 到汇点 t 之间的增广路径,若有,找出增广路径上每一段的最小值delta,若无,则结束。 寻找增广路径时用BFS来找,并且更新残留网的值。 找到delta后,则使最大流值加上delta,更新为当前最大的最大流值。 更详细的到:http://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html SAP算法 1.首先设 h 数组,h[i]表示节点 i 到汇点经过的最少路径数; 2.在一次寻找可行路径的过程中,若此时已到达 i 点,对于,若h[i]=h[j]+1,则j为可选点,这样可保证每次找到... 阅读全文
posted @ 2013-08-15 16:41 yongren1zu 阅读(740) 评论(0) 推荐(0) 编辑
摘要: 题意:有m到题,t个队伍,给出第 i 支队作出 第 j 道题的概率 Pij。求每个队至少作出一道题,作出最多的那个队伍至少作出 n 道题的概率。 dp[i][j][k]表示第 i 支队前 j 道题作出 k 道的概率,dp[i][j][k] = dp[i][j-1][k]*(1-p[i][j])+dp[i][j-1][k-1]*p[i][j]. s[i][k]表示第 i 支队作出题目个数 0~k 的概率。 s[i][k]=dp[i][m][0]+dp[i][m][1]+...+dp[i][m][k]. s[i][m]-s[i][0]表示第 i 支队至少作出一道题的概率,s[i][n-... 阅读全文
posted @ 2013-08-10 22:43 yongren1zu 阅读(151) 评论(0) 推荐(0) 编辑