还是一道动态规划 整体思路还是分成子问题 用表格的方法看起来比较清晰
如果第i-1和第j-1项相等 则maxlen=maxlen[i-1][j-1]+1 这是很显然的
如果不相等 那么(i,j)等于该项左边数字和上面数字取最大值(maxlen[i][j-1],maxlen[i-1][j])在mooc中老师证明了一下一定等于两个数中的一个 这里就不写下来了 仔细想一想也可以想出来了
注意要写出边界条件,对后续思考有所帮助 这道题中是在i=0/j=0时maxlen为0 也是很显然的 填满第一行和第一列以后 后面的过程其实就是已知左、上、左上的数字求右下数字的过程
#include <iostream>
#include <cstring>
using namespacestd;
int main(int argc,const char * argv[]) {
int i, j, maxlen[1000][1000];
char s1[1000], s2[1000];
int len1, len2;
while(cin >> s1 >> s2){
len1 = strlen(s1);
len2 = strlen(s2);
for( i =0; i <= len1; i ++ ){
maxlen[0][i] =0;
}
for( j =0; j <= len2; j ++ ){
maxlen[j][0] =0;
}
for( i =1; i <= len1; i ++){
for( j =1; j <= len2; j ++){
if( s1[i -1] == s2[j - 1]){
maxlen[i][j] = maxlen[i - 1][j -1] + 1;
}
else{
maxlen[i][j] = max(maxlen[i -1][j], maxlen[i][j - 1]);
}
}
}
cout << maxlen[len1][len2] <<endl;
//printf("%d", maxlen[len1][len2]);
}
return0;
}