1.一个简单的dp问题
http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17083
这个题的代码比较简单,状态转移方程也比较容易。现在对于状态转移方程的理解有了不一样的感受,它就好像高中时写通项公式一样,熟练之后就能很快的写出来。
代码如下:
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 char str1[1005],str2[1005]; 6 int len1,len2,dp[1005][1005];//数组太大一定要放在主函数的外面 7 int main() 8 { 9 while(cin>>str1>>str2) 10 { 11 len1=strlen(str1); 12 len2=strlen(str2); 13 for(int i=0;i<=len1;i++) 14 dp[i][0]=0; 15 for(int i=0;i<=len2;i++) 16 dp[0][i]=0; 17 for(int i=1;i<=len1;i++)//i=len1是为了将if条件照顾到 18 for(int j=1;j<=len2;j++) 19 { 20 if(str1[i-1]==str2[j-1]) 21 dp[i][j]=dp[i-1][j-1]+1;//状态转移方程1 22 else 23 dp[i][j]=max(dp[i-1][j],dp[i][j-1]);//状态转移方程2。。。。当为 = 时仍然能够满足条件 24 } 25 cout<<dp[len1][len2]<<endl; 26 } 27 return 0; 28 }