DP问题
xiaomajiyue
这个作者很懒,什么都没留下…
展开
-
poj 1836 Alignment
<br />好不容易想到从左往右求一次LIS,再从右往左求一次LIS,然后就不断wa,看了discuss,才知道并不是总是相邻的相加<br />#include<iostream> using namespace std; #define N 1005 double 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 · 313 阅读 · 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 50005 using namespace std; int dp[N][4],sum[N],a[N]; int mymax(int c,int d) { re原创 2011-04-04 19:47:00 · 664 阅读 · 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 · 311 阅读 · 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];#include using namespace std; #define N 8000 int 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 · 280 阅读 · 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 1000000000 using namespace std; int p[N],dp[N],sum[N]原创 2011-04-04 12:27:00 · 398 阅读 · 0 评论 -
poj 3176 Cow Bowling
数塔问题,最最简单的DP了吧#include #define N 355 int 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 · 337 阅读 · 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 · 354 阅读 · 0 评论 -
poj 1159 Palindrome
<br />拿到这题前,知道是最长公共子序列。看了之后,发现,只要求一下原串与反串的最长公共子序列就可以了。自己也讲不出个所以然,discuss里讲的挺好的<br />http://poj.org/showmessage?message_id=95237<br /><br /><br /><br />原创 2011-04-06 08:52:00 · 346 阅读 · 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 · 453 阅读 · 0 评论