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;
}

  

原文地址:https://www.cnblogs.com/zhanglanyun/p/2113292.html