Http://acm.hdu.edu.cn/showproblem.php? PID = 1, 1501
Two Methods: 1.dfs, 2, direct push
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 #define maxn 1000 6 using namespace std; 7 8 int dp[maxn][maxn]; 9 char str1[maxn],str2[maxn],str3[maxn];10 bool flag;11 bool vis[maxn][maxn];12 13 void dfs(int p1,int p2,int pos)14 {15 if(str3[pos]==‘\0‘) flag=true;16 if(flag||vis[p1][p2]) return ;17 vis[p1][p2]=true;18 if(str1[p1]==str3[pos])19 dfs(p1+1,p2,pos+1);20 if(str2[p2]==str3[pos])21 dfs(p1,p2+1,pos+1);22 }23 24 int main()25 {26 int n;27 while(scanf("%d",&n)!=EOF)28 {29 for(int cas=1; cas<=n; cas++)30 {31 scanf("%s %s %s",str1+1,str2+1,str3+1);32 str1[0]=‘@‘; str2[0]=‘@‘;str3[0]=‘@‘;33 int k1=strlen(str1);34 int k2=strlen(str2);35 for(int i=1; i<k1; i++)36 {37 if(str1[i]==str3[i]) dp[i][0]=1;38 }39 for(int i=1; i<k2; i++)40 {41 if(str2[i]==str3[i]) dp[0][i]=1;42 }43 for(int i=1; i<k1; i++)44 {45 for(int j=1; j<k2; j++)46 {47 dp[i][j]=(dp[i-1][j]&&str1[i]==str3[i+j])||(dp[i][j-1]&&str2[j]==str3[i+j]);48 }49 }50 printf("Data set %d: ",cas);51 memset(vis,false,sizeof(vis));52 flag=false;53 dfs(1,1,1);54 if(flag) printf("yes\n");55 else printf("no\n");56 }57 }58 return 0;59 }
View code