上一页 1 ··· 4 5 6 7 8 9 10 11 12 13 下一页
摘要: 链接:http://poj.org/problem?id=1170很经典的状态dp,这道题基本上体现了状态dp的全部处理过程,状态进制的确定过程,主要是根据题中的数据范围,状态产生要根据输入的状态产生,中间状态合法性判断,对状态的计算处理,然后才是dp里的最优子结构选择问题,当然了要保证一个选择只有一种状态,这是肯定的。最后就是结果的处理过程。View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define inf 0x7fffffff 5 #define min( 阅读全文
posted @ 2012-05-19 00:05 zhenhai 阅读(263) 评论(0) 推荐(0)
摘要: 二分图的最大权匹配问题,而且这道题涉及到了要加点,最大权匹配要保证完全匹配的情况下才能得到值,否则dfs函数会一直进行下去,所以需要把原来的矩阵扩充为一个方阵View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define inf 0x7fffffff 5 #define N 205 6 #define max(x,y) x>y?x:y 7 #define min(x,y) x<y?x:y 8 using namespace std; 9 int map 阅读全文
posted @ 2012-05-18 22:17 zhenhai 阅读(193) 评论(0) 推荐(0)
摘要: 状态dp的一道比较简单的题,令dp[i][j]为第i个状态以第j个单词作为结尾所获得的最优解View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 11 4 char s[N][N]; 5 int dp[1<<N][N]; 6 int mcs[N][N]; 7 int n; 8 int max(int a,int b) 9 {10 return a>b?a:b;11 }12 void get_mc(int a,int b)13 {14 int len1=strlen(s[a]);15 阅读全文
posted @ 2012-05-16 23:10 zhenhai 阅读(301) 评论(0) 推荐(0)
摘要: 题意是说,给一些大理石,每种有num[i]个,判断能否分成两部分,可行性问题,感觉不像是动态规划,中间没有最优子结构这个性质,倒像是纯粹的递推View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 60005 4 int bag[7]; 5 int v[N]; 6 bool dp[N]; 7 int main() 8 { 9 int sum;10 int i,j,k,ans;11 int icase=1;12 while(1)13 {14 sum=0;15 ... 阅读全文
posted @ 2012-05-15 23:58 zhenhai 阅读(175) 评论(0) 推荐(0)
摘要: 链接:http://poj.org/problem?id=1151线段树的经典应用,求矩形的面积并,把点的位置离散化,看着别人的代码打出来的,还是没怎么搞懂,看来还是要好好研究研究才好啊,线段树用起来真的太灵活,真的要多练习才好啊。View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define l(x) x<<1 5 #define r(x) x<<1|1 6 double y[1000]; 7 struct Line 8 { 9 do 阅读全文
posted @ 2012-05-14 23:19 zhenhai 阅读(289) 评论(0) 推荐(0)
摘要: 以poj 1330为例,因为这道题只是询问一次,还不至于使用st算法,只是在这里说一下怎么做问题的转化,在一个树的深搜过程中,每个点都会被访问到两次,这样形成了一个欧拉序列,假设两个点a,b的最近公共祖先是c那么在深搜的时候,按照顺序访问,如果要从a转到b那么必定会经过一次c节点,从c节点转到b所在的子树上,也就是说,c节点是这个从a到b的所有经过的节点之中,深度最小的一个,我们只需要在第一次出现a和第一次出现c的序列之间去找深度最小的即为其最近公共祖先。即为区间最值问题,rmq问题View Code 1 #include<stdio.h> 2 #include<string 阅读全文
posted @ 2012-05-12 19:48 zhenhai 阅读(246) 评论(0) 推荐(0)
摘要: st算法是解决区间最值问题比较有效的算法,把每一段查询区间分为两部分,用nlogn的预处理求出dp[i][j]从第i个数开始到i+2^j-1之间的最值,如果要查询[a,b]的最值,则可分为[a,a+2^k-1],[b-2^k+1,b-2^k+1+2^k-1]即[b-2^k+1,b]两个区间每次查询的时间为o(1)其中k=(int)(log(b-a+1)/log2)(换底公式)View Code 1 #define N 100005 2 int dp[N][18]; 3 int v[N]; 4 int max(int a,int b) 5 { 6 return a>b?a:b; 7 }.. 阅读全文
posted @ 2012-05-12 15:54 zhenhai 阅读(190) 评论(0) 推荐(0)
摘要: 链接:http://poj.org/problem?id=3321树状数组的题,只是要注意把深搜的时间戳当作是数组的下标,而且如果是根节点,为保证唯一性,结束时间和开始时间应该是一个值,而非根节点的结束时间应为所有根节点结束时间的最晚的View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define lowbit(x) (x)&(-x) 5 #define N 100005 6 using namespace std; 7 int d[N],f[N],tim 阅读全文
posted @ 2012-05-11 23:20 zhenhai 阅读(166) 评论(0) 推荐(0)
摘要: 链接:http://poj.org/problem?id=1733hash+并查集,和食物链那道题比较相似的确定关系的方法,[a,b]之间的1的个数可以通过[0,a-1],[0,b]来确定,所以,node[i].w存的是[0,w]的情况,因为区间比较大,而且问题的个数很少,所以用hash散射在一个数组上,这几道并查集的题都有些似懂非懂,看来这些好多东西弄到一块的题自己还是做的太少啊View Code 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define N 50005 阅读全文
posted @ 2012-05-10 00:30 zhenhai 阅读(256) 评论(0) 推荐(0)
摘要: 链接:http://poj.org/problem?id=1182并查集的一道经典题目,主要是处理两个之间的关系的时候比较难想,也比较麻烦View Code 1 #include<stdio.h> 2 #include<string.h> 3 #define N 50005 4 struct node 5 { 6 int p; 7 int r; 8 }; 9 node f[N];10 int n;11 void init()12 {13 int i;14 for(i=1;i<=n;i++)15 {16 f[i].p=i;17 ... 阅读全文
posted @ 2012-05-09 22:22 zhenhai 阅读(159) 评论(0) 推荐(0)
上一页 1 ··· 4 5 6 7 8 9 10 11 12 13 下一页