题目:http://ac.jobdu.com/problem.php?pid=1042
最优子结构: S[x][y] = S[x-1][y-1] (相等)
= max(S[x][y-1], S[x-1][y]) (不等)
注意:因为dp[][]首行首列都初始化为0,dp[i][j]记录的是 str1[i-1] 与
str2[j-1] 的匹配情况,所以输出最后结果时,输出的是dp[len1][len2],
而不是dp[len1-1][len2-1]
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[110][110];
int main(){
char str1[110];
char str2[110];
while(scanf("%s%s", str1, str2) != EOF){//输入数据
int len1 = strlen(str1);
int len2 = strlen(str2);
//初始化
for (int i = 0; i <= len1; i++) dp[i][0] = 0;
for (int j = 0; j <= len2; j++) dp[0][j] = 0;
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
//递推式
if(str1[i - 1] == str2[j - 1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i][j-1], dp [i-1][j]);
}
}
printf("%d\n", dp[len1][len2]);
}
return 0;
}