hdu 1503 Advanced Fruits DP 워터

1695 단어
방법: 공용 문자열을 구한 후 DFS에서 일치점을 구한다
#include <cstdio>
#include <cstring>
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
const int LMT = 105;
int dp[LMT][LMT], same[LMT], vis[LMT];
char seca[LMT], secb[LMT];
void dfs(int i, int j)
{
    if(dp[i][j] == 0)return;
    for(int ii = i; ii > 0; --ii)
        for(int jj = j; jj > 0; --jj)
            if(seca[ii] == secb[jj] && dp[ii][jj] == dp[i][j])
            {
                vis[ii] = jj;
                dfs(ii - 1, jj - 1);
                return;
            }
        return;
}
int main(void)
{
    int i, j, lena, lenb;
    seca[0] = secb[0] = 5;
    while(~scanf("%s%s",&seca[1], &secb[1]))
    {
        lena = strlen(&seca[1]);
        lenb = strlen(&secb[1]);
        memset(dp, 0, sizeof(dp));
        memset(vis, 0, sizeof(vis));
        for(i = 1; i <= lena; ++i)
            for(j = 1; j <= lenb; ++j)
            {
                if(seca[i] == secb[j]) dp[i][j] = dp[i-1][j-1] + 1;
                dp[i][j] = max(dp[i][j], dp[i-1][j]);
                dp[i][j] = max(dp[i][j], dp[i][j - 1]);
            }
            dfs(lena, lenb);
            j = i = 1;
            vis[lena + 1] = 5000;
            while(i <= lena || j <= lenb)
            {
                for(;vis[i] == 0 && i <= lena; ++i)printf("%c",seca[i]);
                for(;j < vis[i] && j <= lenb; ++j)printf("%c",secb[j]);
                if(i <=lena) printf("%c",seca[i]);
                ++i;++j;
            }
            printf("
"); } return 0; }

좋은 웹페이지 즐겨찾기