题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1501
#include <iostream>
#include <string.h>
using namespace std;
/****************************************************************************************************************
题意:给定三个字符串 s1,s2,s3。判断s3是否可以通过s1,s2字符的顺序得到
思路:
1,刚开始也是想到搜索之类的,然后看到网上说记忆化搜索!记忆化,换而言之就是dp啊
2,最优子结构分析:如上例,如果A、B可以组成C,那么,C最后一个字母e,必定是 A 或 C 的最后一个字母组成。
3,C去除除最后一位,就变成是否可以求出 A-1和B 或者 A与B-1 与 是否可以构成 C-1
4,状态转移方程:
用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]))
****************************************************************************************************************/
string s1,s2,s3;
int dp[205][205];
int main()
{
int T;
cin>>T;
int num=1;
while(T--)
{
cin>>s1>>s2>>s3;
memset(dp,0,sizeof(dp));
for(int i = 0;i < s1.size();i ++)
if(s1[i] == s3[i])
dp[i+1][0]=1;
for(int i = 0;i < s2.size();i ++)
if(s2[i] == s3[i])
dp[0][i+1]=1;
for(int i = 1;i <= s1.size();i ++)
for(int j = 1;j <= s2.size();j ++)
dp[i][j]=((dp[i-1][j] && s1[i-1] == s3[i+j-1]) || (dp[i][j-1] && s2[j-1] == s3[i+j-1]));
cout<<"Data set "<<num++<<": ";
if(dp[s1.size()][s2.size()])
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}