DP
二十一画生
嚶其鳴矣求其友聲
展开
-
POJ 1836 Alignment
题意: 令原队列的最少士兵出列后,使得新队列任意一个士兵都能看到左边或者右边的无穷远处。就是使新队列呈三角形分布就对了。 要求最少出列数,就是留队士兵人数最大,即左边的递增序列人数和右边的递减序列人数之和最大 因而可转化为求“最长降子序列”和“最长升子序列”问题 #include using namespace std; int main() { int i,j,n,f原创 2013-07-04 22:04:55 · 783 阅读 · 0 评论 -
hdu 2059 龟兔赛跑
//Time 0ms, Memory 212K#include #include int main() { int i,j,l,n,c,t,vr,v1,v2,a[105],len; double temp,ti,min,d[105]; while(scanf("%d",&l)==1) { memset(d,0,sizeof(d));原创 2013-06-07 20:16:26 · 836 阅读 · 0 评论 -
POJ 3267 The Cow Lexicon
题意:就是给出一个主串,和一本字典,问最少在主串删除多少字母,可以使其匹配到字典的单词序列。 PS:是匹配单词序列,而不是一个单词。 f[i]表示从message中第i个字符开始,到第L个字符(结尾处)这段区间所删除的字符数,初始化为f[L]=0 由于我的程序是从message尾部向头部检索匹配,所以是下面的状态方程: 1、f[i]=f[i+1]+1 不能匹配时原创 2013-07-04 20:10:09 · 777 阅读 · 0 评论 -
POJ 2533 Longest Ordered Subsequence
大致题意:求最长升子序列。 f[i]:前i+1个元素中包括第i+1个的最长升子序列。 // Time 32ms; Memory 224K#include using namespace std; int main() { int i,j,n,a[1010],f[1010],max; cin>>n; for(i=0;i<n;i++) cin>>a[i]; f[0]=1; for(i原创 2013-07-05 17:18:41 · 817 阅读 · 0 评论 -
POJ 1260 Pearls
题意: 给出几类珍珠,以及它们的单价,要求用最少的钱就可以买到相同数量的,相同(或更高)质量的珍珠。 规定买任一类的珍珠n个(价格为p),都要支付(n+10)*p的钱,即额外支付10*p。 (1) 要求要买的珍珠的数量是一定的 (2) 所买的珍珠的质量允许提高,但不允许下降(即可以用高质量珍珠替代低质量) (3)原创 2013-07-05 16:55:10 · 856 阅读 · 0 评论 -
POJ 1276 Cash Machine
动态规划,多重背包 题目大意: 有各种不同面值的货币,每种面值的货币有不同的数量,请找出利用这些货币可以凑成的最接近且小于等于给定的数字cash的金额。 // Time 79ms; Memory 640K #include using namespace std; int v,f[100010]; int max(int a,int b) { return a>b?a:原创 2013-07-03 21:47:24 · 838 阅读 · 0 评论 -
POJ 1159 Palindrome
大致题意:给定一个字符串,添加字符,使该字符串左右对称,求添加字符数最少。 设原序列S的逆序列为S' ,则这道题目的关键在于, 最少需要补充的字母数 = 原序列S的长度 — S和S'的最长公共子串长度 静态数组开销大小为5001*5001的int是铁定超的. 据说用short int的话不会MLE,有兴趣的同学可以试试 这里重点讲一下滚动数原创 2013-07-06 21:30:55 · 1078 阅读 · 0 评论 -
POJ 1080 Human Gene Functions
题意:是求最长公共子序列的一个变型题;此题中的字符只有A,G,C,T四个,再加上'-';它们之间的不同匹配有对应的不同权值W;而且只有字符相同的匹配的权值为大于0;其他都为负值。此题就是求权值最大的匹配。 f[i][j]: 表示第一个字符串的前 i 个字符和第二个字符串的前 j 个字符的最大权值。 状态方程: f[i][j]=max(f[i-1][j]+w[a[i]]['-'],f[原创 2013-07-06 10:18:03 · 1153 阅读 · 0 评论 -
POJ 3176 Cow Bowling
大致题意: 输入一个n层的三角形,第i层有i个数,求从第1层到第n层的所有路线中,权值之和最大的路线。 规定:第i层的某个数只能连线走到第i+1层中与它位置相邻的两个数中的一个。 f[i][j]:表示第 i 行第 j 列到最后一行的最大权值和; 状态方程: f[i][j]=w[i][j]+max(f[i+1][j],f[i+1][j+1]); //原创 2013-07-06 09:17:18 · 1301 阅读 · 0 评论 -
hdu 1080 Human Gene Functions
//Time 0ms, Memory 288K#include #include int main() { int i,j,la,lb,t,map[20][20],dp[105][105],x,y,z; char a[105],b[105]; memset(map,0,sizeof(map)); map[0][0]=map[2][2]=map[6][6]=map[1原创 2013-06-11 08:07:03 · 1274 阅读 · 0 评论