1. 程式人生 > >POJ 1458(DP初步_B題)解題報告

POJ 1458(DP初步_B題)解題報告

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>
#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; }
View Code

POJ 1458(DP初步_B題)解題報告