POJ
DFS
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
using namespace std;
typedef unsigned long long ULL;
int la,lb,lc;
char a[205],b[205],c[409];
int dfs(int x,int y,int sum)
{
if(sum>=lc)
return 1;
if(a[x]==c[sum]&&dfs(x+1,y,sum+1))
return 1;
if(b[y]==c[sum]&&dfs(x,y+1,sum+1))
return 1;
return 0;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);
int n;
while(scanf("%d",&n)!=EOF) //挺玄学的,将这块改为cin>>n就错了,不知道为啥。。。
for(int i=1;i<=n;i++)
{
scanf("%s%s%s",a,b,c);
la=strlen(a);
lb=strlen(b);
lc=strlen(c);
int flag=0;
if(a[la-1]==c[lc-1]||b[lb-1]==c[lc-1])//减枝。
flag=dfs(0,0,0);
if(flag == 1)
printf("Data set %d: yes\n",i);
else
printf("Data set %d: no\n",i);
}
return 0;
}
DP
DP求解:定义dp[i][j]表示A中前i个字符与B中前j个字符是否能组成C中的前 (i+j) 个字符,如果能标记true,如果不能标记false;
有了这个定义,我们就可以找出状态转移方程了,初始状态dp[0][0] = 1:
dp[i][j] = 1 如果 dp[i-1][j] == 1 && C[i+j-1] == A[i-1]
dp[i][j] = 1 如果 dp[i][j-1] == 1 && C[i+j-1] == B[j-1]
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<ctype.h>
#include<stack>
#include<math.h>
#include <string>
#include<algorithm>
using namespace std;
char a[205],b[205],c[409];
int dp[205][205];
int main()
{
int n;
scanf("%d",&n);
for(int k=1;k<=n;k++)
{
memset(dp,0,sizeof(dp));
scanf("%s%s%s",a,b,c);
int la=strlen(a);
int lb=strlen(b);
dp[0][0]=1;
for(int i=0;i<=la;i++)
for(int j=0;j<=lb;j++)
{
if(i>0&&dp[i-1][j]&&a[i-1]==c[i+j-1])
dp[i][j]=1;
if(j>0&&dp[i][j-1]&&b[j-1]==c[i+j-1])
dp[i][j]=1;
}
printf("Data set %d: %s\n",k,dp[la][lb]==1?"yes":"no");
}
return 0;
}