动态规划入门——Zipper

转载请注明出处:http://blog.csdn.net/a1dark

分析:这题可以用记忆化搜索来做、由于记忆化搜索和DP是相通的、所以也能用DP来做、相用记忆化搜索做一次、注意标记已经访问过的点、以免重复访问超时、

#include<stdio.h>
#include<string.h>
#define N 205
char str1[N];
char str2[N];
char str3[N*2];
int len1,len2,len3,ans;
int vis[N][N];
void dfs(int a,int b,int c){
    if(ans)return;
    if(c==len3){
        ans=1;
        return;
    }
    if(vis[a][b])return;
    vis[a][b]=1;
    if(str1[a]==str3[c])
        dfs(a+1,b,c+1);
    if(str2[b]==str3[c])
        dfs(a,b+1,c+1);
}
int main(){
    int n,cas=1;
    scanf("%d",&n);
    while(n--){
        scanf("%s%s%s",str1,str2,str3);
        len1=strlen(str1);
        len2=strlen(str2);
        len3=strlen(str3);
        printf("Data set %d: ",cas);cas++;
        if(len1+len2!=len3){
            printf("no\n");
            continue;
        }
        memset(vis,0,sizeof(vis));
        ans=0;
        dfs(0,0,0);
        if(ans==1)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}


你可能感兴趣的:(ACM,动态规划入门)