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 }
View Code

相关文章: