POJ 1458(DP初步_B题)解题报告

Posted caomingpei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 1458(DP初步_B题)解题报告相关的知识,希望对你有一定的参考价值。

题目链接: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题)解题报告的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 607B(DP初步_H题)解题报告

CodeForces 5C(DP初步_G题)解题报告

SCU 1114(DP初步_A题)解题报告

POJ 2260(模拟&贪心_B题)解题报告

poj 1458 最长公共子序列

POJ 3122 (集训比赛2B_B题)解题报告