POJ 2192 【DP】

题意:

给三个字符串,判断前两个在相对顺序不变的情况下是否可以组成第三个字符串。

思路:

先说屌丝:

dp[i][j]代表1串的前i个和2串的前j个字符在3串的前i+j个字符中最多能够组合出几个字符。

然后状态转移是:

如果stra[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i-1][j]+1)

同样的若strb[i]==strc[i+j]则,dp[i][j]=max(dp[i][j],dp[i][j-1]+1)

最后判断dp[lena][lenb]是否等于lena+lenb

再说大神思路:

大神直接把dp定义成bool型,初始化dp[0][0]=1;

然后dp[i]][j]=dp[i-1][j]&&tmpa[i]==tmpc[i+j]||dp[i][j-1]&&tmpb[j]==tmpc[i+j]

屌丝代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[205][205];
int main()
{
    int t;
    scanf("%d",&t);
    char tmpa[205],tmpb[205],tmpc[505];
    for(int tt=1; tt<=t; tt++)
    {
        memset(dp,0,sizeof(dp));
        scanf("%s%s%s",tmpa+1,tmpb+1,tmpc+1);
        int lena=strlen(tmpa+1);
        int lenb=strlen(tmpb+1);
        int lenc=strlen(tmpc+1);
        if(lena+lenb!=lenc)
        {
            printf("Data set %d: no
",tt);
        }
        else
        {
            for(int i=0; i<=lena; i++)
            {
                for(int j=0; j<=lenb; j++)
                {
                    if(i!=0)
                    {
                        if(tmpa[i]==tmpc[i+j])
                        {
                            dp[i][j]=dp[i-1][j]+1;
                        }
                        else
                        {
                            dp[i][j]=dp[i-1][j];
                        }
                    }
                    if(j!=0)
                    {
                        if(tmpb[j]==tmpc[i+j])
                        {
                            dp[i][j]=max(dp[i][j],dp[i][j-1]+1);
                        }
                        else
                        {
                            dp[i][j]=max(dp[i][j],dp[i][j-1]);
                        }
                    }
                }
            }
            /*for(int i=0;i<=lena;i++)
            {
                for(int j=0;j<=lenb;j++)
                {
                    printf("%d ",dp[i][j]);
                }
                puts("");
            }*/
            if(dp[lena][lenb]==lenc)
            {
                printf("Data set %d: yes
",tt);
            }
            else
            {
                printf("Data set %d: no
",tt);
            }
        }
    }
}
原文地址:https://www.cnblogs.com/tun117/p/4905624.html