链接:https://vjudge.net/problem/OpenJ_Bailian-2192
思路:用dp[i][j]表示第一个字符串使用前i个字符,第二个字符串使用j个字符能否与后面的长串匹配,那么下一个字符匹配要嘛和dp[i+1][j]相同,要嘛和dp[i][j+1]相同,所以建立状态转移。
代码:
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
string a,b,c;
const int maxn = 201;
int dp[maxn][maxn];
int main(){
int t;
cin>>t;
int o=0;
while(t--){
cin>>a>>b>>c;
memset(dp,0,sizeof(dp));
dp[0][0] = 1;
for(int i=0;i<=a.size();i++){
for(int j=0;j<=b.size();j++){
if(i>0&&dp[i-1][j]==1&&a[i-1]==c[i+j-1])dp[i][j] = 1;
if(j>0&&dp[i][j-1]==1&&b[j-1]==c[i+j-1])dp[i][j] = 1;
}
}
cout<<"Data set "<<++o<<": ";
if(dp[a.size()][b.size()])
cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
return 0;
}