POJ 1458(DP初步_B題)解題報告
阿新 • • 發佈:2018-01-29
con lap %d org for opened long hid body
題目鏈接: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> #includeView Code<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; }
POJ 1458(DP初步_B題)解題報告