hdu1501 记忆化搜索

题意:
      给你三个字符串,问你前两个能不能拼成第三个串。


思路:

      直接记忆化神搜就行,思路水,看下代码就知道了。这个题目我感觉最大公共子序列dp的作法是错的,虽然有人ac了,随便一组数据比如 abc abc abccba。


#include<stdio.h>
#include<string.h>

char c1[222] ,c2[222] ,c3[444];
int mark[222][222];
int ok ,l1 ,l2 ,l3;

void DFS(int n1 ,int n2 ,int n3)
{
     if(n3 == l3 + 1)
     {
          ok = 1;
          return ;
     }
      if(mark[n1][n2]) return;
      mark[n1][n2] = 1;
      if(n1 <= l1 && c3[n3] == c1[n1] && !ok)
      {
           DFS(n1 + 1 ,n2 ,n3 + 1);
      }
      
      if(n2 <= l2 && c3[n3] == c2[n2] && !ok)
      {            
          DFS(n1 ,n2 + 1 ,n3 + 1);
      }
}

int main ()
{
    int t ,cas = 1;
    scanf("%d" ,&t);
    while(t--)
    {
         scanf("%s %s %s" ,c1 ,c2 ,c3);
         l1 = strlen(c1) - 1;
         l2 = strlen(c2) - 1;
         l3 = strlen(c3) - 1;
         if(l1 + 1 + l2 + 1 != l3 + 1)
         {
              printf("Data set %d: no
" ,cas ++);
              continue;
          } 
          ok = 0;
          memset(mark ,0 ,sizeof(mark));
          DFS(0 ,0 ,0);
          if(ok) printf("Data set %d: yes
" ,cas ++);
          else printf("Data set %d: no
" ,cas ++);
      }
      return 0;
}     
         
    
    

原文地址:https://www.cnblogs.com/csnd/p/12063121.html