DP问题
xiaomajiyue
这个作者很懒,什么都没留下…
展开
-
poj 1836 Alignment
<br />好不容易想到从左往右求一次LIS,再从右往左求一次LIS,然后就不断wa,看了discuss,才知道并不是总是相邻的相加<br />#include<iostream>using namespace std;#define N 1005double p[N];int lef[N],rig[N];int main(){ int n,i,temp,j; scanf("%d",&n); for(i=1;i<=n;i++) scanf("%lf",p+i);原创 2011-04-03 19:52:00 · 296 阅读 · 0 评论 -
poj 1976 A Mini Locomotive
<br />b[i]=a[i]+a[i+1]+......a[i+m-1];<br />dp[i][j]表示用j个火车头装前i个b,最后输出dp[n-m+1][3];<br />则b[i]装或者不装,不装则dp[i-1][j],装则dp[i-m][j-1]+b[i];<br />#include<iostream>#define N 50005using namespace std;int dp[N][4],sum[N],a[N];int mymax(int c,int d){ re原创 2011-04-04 19:47:00 · 652 阅读 · 0 评论 -
poj 3267 The Cow Lexicon
<br />用dp[i]记录msg中从0到i的最少要删除的字符数。每扫描一个字符s[i],dp[i]最多为<br />dp[i-1]+1,然后对于每一个单词,从i往前找,如果找到,min{dp[j]+i-j-len[k],dp[i]}<br />如果没有找到,还是dp[i]。<br />#include<iostream>#include<cstring>using namespace std;char w[605][30],s[305];int dp[305],len[605];int原创 2011-04-03 14:12:00 · 299 阅读 · 0 评论 -
poj 1837 Balance
dp[i][j]记录前i个砝码平衡度为j的方法数。假如已经知道了前i个砝码所有的平衡度的方法数,则就可以求出前i+1个砝码的所有平衡度的方法数,dp[i][j+p[k]*w[i]+4000]+=dp[i-1][j+4000],最后的答案是dp[n][4000];#includeusing namespace std;#define N 8000int dp[25][N],w[25],p[25];int main(){ int c,g,i,j,k; scanf("%d%d",&c,原创 2011-04-03 14:24:00 · 263 阅读 · 0 评论 -
poj 1260 Pearls
<br />dp[i]记录到i为止的最小花费,对于第i个种类,也许1~i都用策略i,或者2~i用策略i。。。。k~i用策略i(k>=1&&k<i),换句话说,就是前k个知道最小花费,k+1~i用策略i,<br />dp[k]+(sum[i]-sum[k]+10)*p[i](k>=0&&k<i);<br />#include<iostream>#define N 105#define inf 1000000000using namespace std;int p[N],dp[N],sum[N]原创 2011-04-04 12:27:00 · 385 阅读 · 0 评论 -
poj 3176 Cow Bowling
数塔问题,最最简单的DP了吧#include#define N 355int a[N][N],dp[N][N];int mymax(int c,int d){ return c>d?c:d;}int main(){ int n,i,j; scanf("%d",&n); for(i=1;i=1;i--) for(j=1;j原创 2011-04-04 21:07:00 · 323 阅读 · 0 评论 -
poj 1080 Human Gene Functions
<br />dp[i][j]记录a的前i个字符 与 b的前j个字符进行匹配得到的最大值。dp[i][j] 由dp[i-1][j],<br />dp[i][j-1],dp[i-1][j-1]三种情况得来。第一种情况:a的前i-1个字符与b的前j个字符匹配得到的最大值,再加上a[i]与‘-’的匹配情况;第二第三种情况类似。<br />果然是LCS的思想<br /><br />原创 2011-04-06 12:43:00 · 337 阅读 · 0 评论 -
poj 1159 Palindrome
<br />拿到这题前,知道是最长公共子序列。看了之后,发现,只要求一下原串与反串的最长公共子序列就可以了。自己也讲不出个所以然,discuss里讲的挺好的<br />http://poj.org/showmessage?message_id=95237<br /><br /><br /><br />原创 2011-04-06 08:52:00 · 335 阅读 · 0 评论 -
LCS && LIS
<br />LIS的子问题:dp[i]记录以a[i]为终点的最长上升子序列的长度<br />dp[1]=1;for(i=2;i<=n;i++){ temp=0; for(j=1;j<i;j++) if(a[i]>a[j]&&dp[j]>temp) temp=dp[j]; dp[i]=temp+1;}<br /> <br />LCS的子问题:dp[i][j]记录以i结尾的s1与以j结尾的s2的最长公共子序列的长度<br />n1=strlen(s1+1); n2=s原创 2011-04-06 09:56:00 · 440 阅读 · 0 评论