| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
用DFS的同学注意了!!我写了一个从第一个字符开始的深搜结果超时了,然后加一个剪枝:判断C的最后一个字符是否等于A或B的最后一个字符。这样就可以AC了。网上有说还有一个剪枝是判断C的长度是否等于A+B的长度,个人认为这个是多余的,题目中有说:The length of the third string is always the sum of the lengths of the first two strings。所以不存在长度不符合的情况。
同样的道理,我决定从最后一个字符开始深搜试试,不加任何剪枝就AC了。
所以应该是这题的数据的问题了。
代码:
//从头开始深搜
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string.h>
using namespace std;
const int maxn=205;
char a[maxn],b[maxn],c[maxn*2];
int n,m,L;
int dfs(int x,int y,int z)
{
if(z==0) return 1;
if(c[z]!=a[x] && c[z]!=b[y]) return 0;
if(c[z]==a[x] && dfs(x-1,y,z-1)) return 1;
if(c[z]==b[y] && dfs(x,y-1,z-1)) return 1;
return 0;
}
int main()
{
int T,ncase=0;
cin>>T;
while(T--)
{
scanf("%s%s%s",a+1,b+1,c+1);
n=strlen(a+1);
m=strlen(b+1);
L=strlen(c+1);
int ans=dfs(n,m,n+m);
printf("Data set %d: %s\n",++ncase,ans?"yes":"no");
}
return 0;
}
//从尾开始深搜
#include <iostream>
#include <stdio.h>
#include <memory.h>
#include <string.h>
using namespace std;
const int maxn=205;
char a[maxn],b[maxn],c[maxn*2];
int n,m,L;
int dfs(int x,int y,int z)
{
if(z>L) return 1;
if(c[z]!=a[x] && c[z]!=b[y]) return 0;
if(c[z]==a[x] && dfs(x+1,y,z+1)) return 1;
if(c[z]==b[y] && dfs(x,y+1,z+1)) return 1;
return 0;
}
int main()
{
int T,ncase=0;
cin>>T;
while(T--)
{
int ans=0;
scanf("%s%s%s",a+1,b+1,c+1);
n=strlen(a+1);
m=strlen(b+1);
L=strlen(c+1);
if(c[L]==a[n] || c[L]==b[m]) ans=dfs(1,1,1);
printf("Data set %d: %s\n",++ncase,ans?"yes":"no");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator