题目链接:https://cn.vjudge.net/problem/HDU-5707
题意:问两个串a,b,各自相对顺序不变,能不能合成c串
题解:dp[i][j]表示a要前i个,b要前j个能不能组成c的前(i+j)个
#include<bits/stdc++.h>
using namespace std;
char a[2100],b[2100],c[2100];
int dp[2100][2100];
int main()
{
while(~scanf("%s%s%s",a+1,b+1,c+1))
{
int la=strlen(a+1);
int lb=strlen(b+1);
int lc=strlen(c+1);
if(la+lb != lc)
{
printf("No\n");
continue;
}
for(int i=0;i<=la;i++)
for(int j=0;j<=lb;j++)
dp[i][j]=0;
dp[0][0]=1;
for(int i=0;i<=la;i++)
for(int j=0;j<=lb;j++)
{
if(i==0 && j==0) continue;
if(i) dp[i][j]|=(dp[i-1][j]&(a[i]==c[i+j]));
if(j) dp[i][j]|=(dp[i][j-1]&(b[j]==c[i+j]));
// printf("%d%c",dp[i][j]," \n"[j==lb]);
}
printf(dp[la][lb]?"Yes\n":"No\n");
}
return 0;
}