码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-01-29 21:28:41      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:tor   col   const   include   eps   cstring   view   ace   ref   

题目链接: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题)解题报告

标签:tor   col   const   include   eps   cstring   view   ace   ref   

原文地址:https://www.cnblogs.com/caomingpei/p/8379262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!