POJ 2250 Compromise

最长公共子序列 变形

重点是最后不是求长度 而是最长序列的列举其中一种情况

所以注意标记 刚开始用dp[i][j] = 1,2,3,4…… 就以为是解  其实不然

很难具体说 看代码吧

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::string;
const int maxn = 105;
char a[maxn][35], b[maxn][35];
int dp[maxn][maxn];
char ans[maxn][maxn][3500];
int main()
{    
    while(scanf("%s", a[1])!=EOF)
    {
        int i = 1, j, round=0;
        memset(dp, 0, sizeof(dp));
        memset(ans, 0, sizeof(ans));
        if(strcmp(a[1], "#")!=0)
            while(scanf("%s", a[++i]), strcmp(a[i], "#")!=0);
        int lenA = i-1;
        i = 0;
        while(scanf("%s", b[++i]), strcmp(b[i], "#")!=0);
        int lenB = i-1;
        for(i=1; i<=lenA; i++)
            for(j=1; j<=lenB; j++)
            {
                if(dp[i][j-1] <= dp[i-1][j])
                {
                    dp[i][j] = dp[i-1][j];
                    strcpy(ans[i][j], ans[i-1][j]);
                }
                else
                {
                    dp[i][j] = dp[i][j-1];
                    strcpy(ans[i][j], ans[i][j-1]);
                }
                if(!strcmp(a[i], b[j]))
                {
                    if(dp[i][j] < dp[i-1][j-1]+1)
                    {
                        dp[i][j] = dp[i-1][j-1]+1;
                        strcpy(ans[i][j], ans[i-1][j-1]);     
                        strcat(ans[i][j], a[i]);
                        strcat(ans[i][j], " ");
                    }
                }
            }
            int size = strlen(ans[lenA][lenB]);
            for(i=0; i<size-1; i++)
                printf("%c", ans[lenA][lenB][i]);
            printf("\n");
    }
    return 0;
}

 

posted @ 2013-03-04 13:23  April_Tsui  阅读(144)  评论(0编辑  收藏  举报