题目链接:http://poj.org/problem?id=2192
题意:给你三个字符串,问第三个字符串能否由前两个字符串按顺序组成(第三字符串的长度等于前两个字符串长度之和)
搜索的办法(比较容易看懂):
Code:
#include<stdio.h>
#include<string.h>
char a[250],b[250],ab[500];
int Case,T;
int dfs(int x,int y)
{
if(x == -1 && y == -1)
return 1;
if(x >= 0 && a[x] == ab[x+y+1])
if( dfs(x-1,y) )
return 1;
if(y >= 0 && b[y] == ab[x+y+1])
if( dfs(x,y-1) )
return 1;
return 0;
}
int main()
{
int lena,lenb;
scanf("%d",&Case);
for(T=1;T<=Case;T++)
{
scanf("%s%s%s",a,b,ab);
lena=strlen(a);
lenb=strlen(b);
printf("Data set %d: ",T);
if(dfs(lena-1,lenb-1))
printf("yes\n");
else
printf("no\n");
}
}
DP的方法(转载自:http://www.cppblog.com/longshen/archive/2009/05/10/82456.html):
Code:
#include <iostream>
#define MAX 210
using namespace std;
char a[MAX], b[MAX], c[2*MAX];
int dp[MAX][MAX];
int main()
{
int i, j, t, cas;
scanf("%d", &cas);
for(t = 1; t <= cas; t++){
scanf("%s%s%s", a, b, c);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
int la, lb;
la = strlen(a);
lb = strlen(b);
for(i = 0; i <= la; i++){
for(j = 0; j <= lb; j++){
if(i > 0 && a[i-1] == c[i+j-1] && dp[i-1][j])
dp[i][j] = 1;
if(j > 0 && b[j-1] == c[i+j-1] && dp[i][j-1])
dp[i][j] = 1;
}
}
printf("Data set %d: ", t);
if(dp[la][lb])
printf("yes\n");
else
printf("no\n");
}
return 0;
}