最优子结构分析:如果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#include #define M 202char 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\n",i,run() ? "yes" : "no"); } return 0;}