poj 2192
基本思想就是用d[a][b]表示字符串1的前个字符和字符串2的前b个字符能不能组成目标字符串,若是能则赋值为1,否则复制为零,具体代码如下:经典的动态规划
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
//char a[201],b[201],c[401];
bool dp[201][401];
void read(){
// ifstream cin("in.txt");
string a,b,c;
int i,j,k;
int cas;
cin>>cas;
for(k=1;k<=cas;k++)
{
cin>>a>>b>>c;
//int n1=strlen(a);
int n1=a.size();
//int n2=strlen(b);
int n2=b.size();
memset(dp,0,sizeof(dp));
//开始没有分清行和列的原因
for(i=1;i<=n1;i++)
if(a.substr(0,i)==c.substr(0,i))
dp[0][i]=true;
else
dp[0][i]=false;
for( i=1;i<=n2;i++)
if(b.substr(0,i)==c.substr(0,i))
dp[i][0]=true;
else
dp[i][0]=false;
for(i=1;i<=n2;i++)
for(j=1;j<=n1;j++)
{
if((dp[i][j-1]&&a[j-1]==c[i+j-1])||(dp[i-1][j]&&b[i-1]==c[i+j-1]))
dp[i][j]=true;
else
dp[i][j]=false;
}
/*for(i=0;i<=n2;i++)
{
for(j=0;j<=n1;j++)
{
cout<<dp[i][j]<<" ";
}
cout<<endl;
}*/
printf("Data set %d: ",k);
if(dp[n2][n1])
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
int main(){
read();
system("pause");
return 0;
}