//============================================================================
// Name : POJ_2192_DP.cpp
// Author : tiger
// s[i][j]:表示st1[i],st2[j]能否组合成st3[i+j]用0,1表示;
// 状态转移方程:若s[i-1][j],s[i][j-1]都为0,则s[i][j]为0;
// 若s[i-1][j] ==1;且st3[i+j] == st1[i],则s[i][j] = 1;
// 若s[i][j-1] == 1;且st3[i+j] == st2[j],则s[i][j] = 1;
// 初始化,s[0][0] = 1;
// s[i][0]表示st1[]的前i个字符是否都与st3[i]相符,相符则为1,否则为0;
// s[0][i]表示st2[]的前i个字符是否都与st3[i]相符,相符则为1,否则为0;
//============================================================================
#include <iostream>
using namespace std;
int dp[403][403];
char s1[202],s2[202];
char s3[403];
bool dodp()
{
memset(dp,0,sizeof(dp));
int len1 =strlen(s1+1);
int len2 =strlen(s2+1);
if(s3[len1+len2] != s1[len1] && s3[len1+len2] != s2[len2] )
return false;
dp[0][0] = 1;
int i,j;
for(i = 1; i <= len1; i++)
{
if( dp[0][i-1] && s1[i] == s3[i] )
dp[0][i] = 1;
else
dp[0][i] = 0;
}
for(i = 1; i <= len2; i++)
{
if(dp[i-1][0] && s2[i] == s3[i])
dp[i][0] = 1;
else
dp[i][0] = 0;
}
for(i = 1; i <= len2; i++)
{
for(j = 1; j <= len1; j++)
{
if(dp[i-1][j] && s2[i]==s3[i+j])
{
dp[i][j] = 1;
}
else
if(dp[i][j-1] && s1[j]==s3[i+j])
{
dp[i][j] = 1;
}
else
dp[i][j] = 0;
}
}
return dp[len2][len1];
}
int main() {
freopen("in","r",stdin);
int t,i;
s1[0] = '#';
s2[0]= '#';
s3[0] = '#';
scanf("%d",&t);
for(i = 1; i <= t; i++)
{
scanf("%s %s %s",s1+1,s2+1,s3+1);
if(dodp())
printf("Data set %d: yes/n",i);
else
printf("Data set %d: no/n",i);
}
return 0;
}
POJ_2192_DP
最新推荐文章于 2022-03-22 22:45:49 发布