最优子结构分析:如果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; }