开始DFS专题 做过, 记得 如果不剪枝不超时,就需要对 搜索过的进行标记,下次不再搜索;
最近看DP,就拿来看看,不过也是弄了一大会的。。。。。。
DFS代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define PI acos(-1.0)
#define max(a,b) (a)>(b)? (a):(b)
#define min(a,b) (a)>(b)? (b):(a)
#define INT_MIN -0x7FFFFFFF
#define INT_MAX 0x7FFFFFFF
int la,lb,lc;
char str1[210],str2[210],str3[410];
int flag,vis[210][210];
void dfs(int x,int y,int z)
{
if(flag) return ;
if(z==lc)
{
flag=1; return ;
}
if(vis[x][y]) return ;
vis[x][y]=1;
if(str1[x]==str3[z])
{
dfs(x+1,y,z+1);
}
if(str2[y]==str3[z])
{
dfs(x,y+1,z+1);
}
}
int main()
{
//freopen("in.txt","r",stdin);
int i,k,j,n,time=0;;
scanf("%d",&n);
while(n--)
{
scanf("%s%s%s",str1,str2,str3);
la==strlen(str1);
lb=strlen(str2);
lc=strlen(str3);
flag=0;
memset(vis,0,sizeof(vis));
dfs(0,0,0);
printf("Data set %d: ",++time);
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}
DP代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define PI acos(-1.0)
#define max(a,b) (a)>(b)? (a):(b)
#define min(a,b) (a)>(b)? (b):(a)
#define INT_MIN -0x7FFFFFFF
#define INT_MAX 0x7FFFFFFF
char str1[210],str2[210],str3[410];
int f[210][210];
int main()
{
// freopen("in.txt","r",stdin);
int la,lb,lc,i,j,k;
int time=0;
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s%s%s",str1,str2,str3);
la=strlen(str1);
lb=strlen(str2);
memset(f,0,sizeof(f));
f[0][0]=1;
for(i=0;i<=la;i++)
{
for(j=0;j<=lb;j++)
{
if(i>0 && f[i-1][j] && str3[i+j-1]==str1[i-1])
{
f[i][j]=1;
}
if(j>0 && f[i][j-1] && str3[i+j-1]==str2[j-1])
{
f[i][j]=1;
}
}
}
printf("Data set %d: ",++time);
if(f[la][lb]) printf("yes\n");
else printf("no\n");
}
return 0;
}
POJ DP代码跑了47MS 而DFS跑了16MS