DP_字串匹配(HDU_1501)

最优子结构分析:如果A、B可以组成C,C最后一个字母必定是A或B的最后一个字母组成。
C去除除最后一位,变成是否可以求出A-1和B或A和B-1是否可以构成C-1
状态转移方程:用f[i][j] 表示A前 i 位和B前 j 位是否可以组成C的前i+j位        
    dp[i][j] = (dp[i-1][j] && A[i]==C[i+j]) || (dp[i][j-1] && B[j]==C[i+j])

#include <stdio.h>
#include <string.h>

#define M 202

char A[M],B[M],C[M*2];
int dp[M][M];

int run()
{
    scanf("%s%s%s",A + 1,B + 1,C + 1);
    int aLen = strlen(A + 1);
    int bLen = strlen(B + 1);
    int cLen = strlen(C + 1);
    
    for(int i=1; i<=aLen; i++)
    {
        if(A[i] == C[i]) dp[i][0] = 1;
    }
    for(i=1; i<=bLen; i++)
    {
        if(B[i] == C[i]) dp[0][i] = 1;
    }
    for(i=1; i<=aLen; i++)
    {
        for(int j=1; j<=bLen; j++)
        {
            dp[i][j] = (dp[i-1][j] && A[i]==C[i+j]) || 
                       (dp[i][j-1] && B[j]==C[i+j]);
        }
    }
    return dp[aLen][bLen];
}

int main(int argc, char* argv[])
{
    #ifdef __MYLOCAL
    freopen("in.txt","r",stdin);
    #endif

    int t;
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        printf("Data set %d: %s
",i,run() ? "yes" : "no");
    }

    return 0;
}
原文地址:https://www.cnblogs.com/lk1993/p/3227068.html