题目链接:http://poj.org/problem?id=1458
--------------------------------------------------------
题意:给你两个字符串, 要你求出两个字符串的最长公共子序列长度。
思路:
首先令dp[i][j]==x表示A串的前i个字符和B串的前j个字符的最长公共子序列长度为x.
初始化: dp全为0.
状态转移:
IfA[i]==B[j]
dp[i][j]= dp[i-1][j-1]+1
else
dp[i][j]= max( dp[i-1][j] , dp[i][j-1] )
上述公式: 当A[i]==B[j]时, A的第i个字符和B的第j个字符必然在A[1..i]和B[1..j]的最长公共子序列中, 所以dp[i][j]==dp[i-1][j-1]+1.
当A[i]!=B[j]时, A[i]和B[j]至少有一个是不可能在A[1..i]和B[1..j]的最长公共子序列中的, 所以dp[i][j] = max( dp[i-1][j] , dp[i][j-1] )
最终所求: dp[n][m].
代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<string> #include<vector> #include<stack> #include<bitset> #include<cstdlib> #include<cmath> #include<set> #include<list> #include<deque> #include<map> #include<queue> using namespace std; typedef long long ll; const double PI = acos(-1.0); const double eps = 1e-6; const int MAXN = 1e4+10; char s1[MAXN]={0}; char s2[MAXN]={0}; int f[MAXN][MAXN]; int main(void){ while(~scanf("%s %s",s1,s2)){ int len1 =strlen(s1); int len2 = strlen(s2); int len = max(len1,len2); //printf("%d\n",len); for(int i=0;i<len;i++){ for(int j=0;j<len;j++){ f[i][j]=0; } } for(int i= 1;i<=len1;i++){ for(int j=1;j<=len2;j++){ if(s1[i-1]==s2[j-1]){ f[i][j]=f[i-1][j-1]+1; }else if(s1[i-1]!=s2[j-1]){ f[i][j]=max(f[i-1][j],f[i][j-1]); } } } printf("%d\n",f[len1][len2]); } return 0; }