/*
emmmm,怎么感觉动态规划都是由后往前推,在前面给定一个限制条件,也就是初始条件,然后就跟着跑就成,dp[i][j]就是假定要确定i,j,那么就看a[i-1]与b[j-1]
是否相等,相等就i,j都往后移一位,更新i,j的答案。如若不等,就看她是由前面哪些条件转换而来,即:dp[i-1][j]、dp[i][j-1]。因为是后一位由前一位更新,所以遍历是从1~len1,1~len2。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn = 1e3+20;
using namespace std;
char a[maxn],b[maxn];
int dp[maxn][maxn];
int main(){
while(~scanf("%s%s",a,b)){
memset(dp,0,sizeof(dp));
int len1 = strlen(a);
int len2 = strlen(b);
for(int i = 1 ; i <= len1 ; i++){
for(int j = 1 ; j <= len2 ; j++){
if(a[i-1] == b[j-1]){
dp[i][j] = dp[i-1][j-1] + 1;
}
else{
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}
Common Subsequence
最新推荐文章于 2021-03-13 16:53:17 发布