poj 2192 Zipper

/* Name: poj 2192 Zipper Author: UnimeSun Date: 16/05/11 21:39 Description: DP */ /* 解题报告:DP 转移方程:dp[i][j]:len1以i,len2以终结时,能否够成串result dp[i][j] = len1[i]==result[i+j]&&dp[i-1][j] || len2[j]==result[j+j]&&dp[i][j-1] true i==0 true j==0 */ #include <iostream> #include <cstdio> #include <cstring> using namespace std; bool dp[401][401]; char szLine1[201], szLine2[201], szResult[401]; int n; int main() { int i, j; while(scanf("%d", &n) != EOF) { int tempn = n; while(n--) { scanf("%s%s%s", szLine1+1, szLine2+1, szResult+1); memset(dp, 0, sizeof(dp)); int len1 = strlen(szLine1+1); int len2 = strlen(szLine2+1); int relen = strlen(szResult+1); if(szLine1[len1]!=szResult[relen] && szLine2[len2]!=szResult[relen]) { printf("Data set %d: no/n", tempn-n); continue; } for(i=1; i<=len1; ++i) if(szLine1[i] == szResult[i]) dp[i][0] = true; for(i=1; i<=len2; ++i) if(szLine2[i] == szResult[i]) dp[0][i] = true; for(i=1; i<=len1; ++i) { for(j=1; j<=len2; ++j) { if(szLine1[i] == szResult[i+j] && dp[i-1][j]) dp[i][j] = true; else if(szLine2[j] == szResult[i+j] && dp[i][j-1]) dp[i][j] = true; else dp[i][j] = false; } } if(dp[len1][len2]) printf("Data set %d: yes/n", tempn-n); else printf("Data set %d: no/n", tempn-n); } } return 0; }

你可能感兴趣的:(poj 2192 Zipper)