HDU - 1503 Advanced Fruits LCS

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiang_6/article/details/88544218

想要合并后尽量短,能够省略的必然是lcs

先进行LCS:

找到lcs后,找到两个串相对应的字母,

本题解思路就是在最长公共子序列中插入两个序列中其他的字符

两个字符串先后顺序没所谓

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

const int maxn = 100 + 7;

char s[maxn];
char t[maxn];

int l1, l2;
int dp[maxn][maxn];
int id1, id2;

void solve() {
    memset(dp, 0, sizeof dp);
    for(int i = 1; i <= l1; ++i) {
        for(int j = 1; j <= l2; ++j) {
            if(s[i] == t[j]) {
                dp[i][j] = max(dp[i][j], 1+dp[i-1][j-1]);
            }
            else {
                dp[i][j] = max(dp[i][j], max(dp[i][j-1], dp[i-1][j]) );
            }
        }
    }
    //cout << dp[l1][l2] << endl;
}
void printlcs(int i, int j) {
    if(!i || !j) return;
    if(s[i] == t[j] && dp[i][j] == dp[i-1][j-1]+1) {
        printlcs(i-1, j-1);
        while(id1 < i) putchar(s[id1++]);
        while(id2 < j) putchar(t[id2++]);
        //cout << i << " .. "  << j << " .. " << s[i] << endl;
        putchar(s[i]);
        id1 = i + 1;
        id2 = j + 1;
    }
    else if(dp[i][j] == dp[i-1][j]) {
        printlcs(i-1, j);
    }
    else {
        printlcs(i, j-1);
    }
}

int main()
{
    while(~scanf("%s", s+1)) {
        scanf("%s", t+1);
        l1 = strlen(s+1);
        l2 = strlen(t+1);
        solve();
        id1 = id2 = 1;
        printlcs(l1, l2);
        while(id1 <= l1) putchar(s[id1++]);
        while(id2 <= l2) putchar(t[id2++]);
        puts("");
    }
    return 0;
}













猜你喜欢

转载自blog.csdn.net/xiang_6/article/details/88544218
今日推荐