题解——51 nod 1006

题目类型LCS

求最大公共子序列

dp模板题

状态转移方程

if(X[i-1] == Y[j-1])
{
dp[i][j] = dp[i-1][j-1] + 1;
}
else
{
dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
}

我用的是二维数组,图就不画了

 

//ac代码
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1001][1001];
char X[1001];
char Y[1001];
int i, j;
char lcs[1001] = {'\0'};
int  main()
{
    scanf("%s",X);
    getchar();
    scanf("%s",Y);
    int xlen = strlen(X);
    int ylen = strlen(Y);
    for(i = 1; i <= xlen; ++i)
    {
        for(j = 1; j <= ylen; ++j)
        {
            if(X[i-1] == Y[j-1])
            {
                dp[i][j] = dp[i-1][j-1] + 1;
            }
            else 
            {
                dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
            }
        }
    }
    i = xlen;
    j = ylen;
    int k = dp[i][j];
    //dp打表 
    while(i && j)
    {
        if(X[i-1] == Y[j-1] && dp[i][j] == dp[i-1][j-1] + 1)
        {
            lcs[--k] = X[i-1];
            i--,j--;
        }
        else if(X[i-1] != Y[j-1] && dp[i-1][j] > dp[i][j-1])  i--;
        else j--;
    }
    //回溯取值 
    printf("%s\n",lcs);
}

 

posted @ 2018-08-20 10:59  pilium  阅读(118)  评论(0)    收藏  举报