dp[i][j]表示第一個字符串前i個與第二個字符串前j個字符能否組成第三個字符串前i+j個;
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int T;
cin>>T;
char str1[205], str2[205], str3[505];
int len1, len2, len3;
bool dp[505][505];
for(int k=1; k<=T; k++)
{
scanf("%s%s%s", str1+1, str2+1, str3+1);
memset(dp, 0, sizeof(dp));
len1 = strlen(str1);
len2 = strlen(str2);
len3 = strlen(str3);
//這三個任意初始化就可以
//但是不知爲啥, 不初始化就不對,明明這三個使用不到的。我因爲沒初始化WR了n次
str1[0]='1';
str2[0]='2';
str3[0]='3';
dp[0][0]=1;
for(int i=0; i<len1; i++)
for(int j=0; j<len2; j++)
{
if((i>=1&&str3[i+j] == str1[i]&&dp[i-1][j]) || (j>=1&&str3[i+j] == str2[j]&&dp[i][j-1]))
dp[i][j]=1;
}
printf( "Data set %d: ", k);
if(dp[len1-1][len2-1]) printf( "yes\n");
else printf( "no\n");
}
}