zoukankan      html  css  js  c++  java
  • HDU 1501 Zipper 字符串

    题目大意:输入有一个T,表示有T组测试数据,然后输入三个字符串,问第三个字符串能否由第一个和第二个字符串拼接而来,拼接的规则是第一个和第二个字符串在新的字符串中的前后的相对的顺序不能改变,问第三个字符串能否由前两个得到。

    解题报告:这题用dfs,反过来,将第三个字符串按照从前到后的顺序,看能否拆成第一个和第二个字符串,不过这题如果只是这样搜索的话,很明显会超时,所以要减掉其中一些重复的其情况,定义一个二维数组hash[i][j],初始化都为0,然后如果将hash[i][j]标记为1表示第一个字符串比较到第i个位置并且第二个字符串比较到第j个位置的情况已经搜索过了,要剪掉。这样就不会超时了,原理应该也比较简单吧。

     1 #include<cstdio>
     2 #include<cstring>
     3 const int MAX =  400+5;
     4 char A[MAX],B[MAX],C[MAX];
     5 int hash[MAX][MAX],len,len1,len2;
     6 int ans,wrong;
     7 void dfs(int i,int j,int k) {
     8     if(ans)
     9     return ;
    10     if(C[k] == '') {
    11         ans = true;
    12         return;
    13     }
    14     if(!hash[i][j]) {
    15         hash[i][j] = 1;
    16         if(C[k] == A[i])
    17         dfs(i+1,j,k+1);
    18         if(C[k] == B[j])
    19         dfs(i,j+1,k+1);
    20     }
    21     return ;
    22 }
    23 
    24 
    25 int main() {
    26     int T,kase = 1;
    27     scanf("%d",&T);
    28     while(T--) {
    29         scanf("%s%s%s",A,B,C);
    30         len = strlen(C);
    31         len1 = strlen(A);
    32         len2 = strlen(B);
    33         ans = false;
    34         memset(hash,0,sizeof(hash));
    35         dfs(0,0,0);
    36         printf(ans? "Data set %d: yes
    ":"Data set %d: no
    ",kase++);
    37     }
    38     return 0;
    39 }
    View Code
  • 相关阅读:
    C语言基本快速入门教程
    几何深度学习前沿
    Anaconda 更改清华源
    大学安全教育-实验室安全测试题库
    《如何写好科研论文》(清华)慕课答案
    集群考试试卷
    集群考试相关
    Linux下tar压缩解压用法
    2020-安全微课(新生入学教育)答案
    函数用法和底层分析
  • 原文地址:https://www.cnblogs.com/xiaxiaosheng/p/3226470.html
Copyright © 2011-2022 走看看