动态规划
文章平均质量分 56
大米GoGoGo
Fighting Fighting Fighting
展开
-
hdu1059(分珠宝)
#include#include #includeint half,a[7],b[20005],f[120005];void ZeroOnePack(int w,int v) //0,1背包 { int i; for(i=half;i>=w;i--) if(f[i-w]+v>f[i]) f[原创 2012-08-12 16:13:03 · 908 阅读 · 0 评论 -
hdu2059(龟兔赛跑)
又是dp问题,思路是看了网上才知道的。。。重点是记录到达当前位置的最短时间。。。 #include#include#include#define Min(a,b) (aint main(){ int L,n,c,t,vr,v1,v2,i,j; double a[110],dp[110],t1,len,min,k; while(scanf("%d",&L)原创 2012-08-15 14:28:32 · 589 阅读 · 0 评论 -
hdu1081 ||poj 1050 To the Max
二维的最大子段和问题。。。依然dp。。。如何将二维变成一维呢?对列 或 对行 进行压缩——如将前j列压缩成1列,就转化成了一维问题了。。。动态转移方程 sum=(sum>0)?sum+f[i][]:f[i][];注意:元素可以为负数#include#include#include#include#define inf 0x7fffffff#define Max(a,原创 2012-09-15 14:02:54 · 419 阅读 · 0 评论 -
zoj1076
最长上升子序列问题。。。当然要先排序。。。下一个的开始点必须大于上一个的结束点。。。同时要记录每一个外显子在排序前的位置,因为输出时需要。。。 #include#include#includestruct Gene{ int b; int e; int p; //记录排原创 2012-08-14 20:34:52 · 770 阅读 · 0 评论 -
CodeForces 156C Cipher
一道神奇的dp题。。。//字符串不管如何处理,其ASCII码总和不变,故凡是长度相同,字母和相同的串都可以转换 //所以f[i][j]的i表示的是字符串的长度,j表示的是字符串所有字母加起来的和,状态转移方程为f[i+1][j+k]+=f[i][j](1#include#include #include#define mod 1000000007char s[110原创 2012-09-21 21:48:13 · 1266 阅读 · 2 评论 -
zoj1986(搭桥)
读了好几遍题,也没想到是求最长上升子序列。。。看了别人的分析后才明白。。。。要想让桥不相交,就必须是上升序列。。。 #include#include #includeint b_search(int a[],int x,int len) //此处用二分查找以降低时间复杂度。。。否则会超时。。。{原创 2012-08-12 17:07:00 · 491 阅读 · 0 评论