UESTC OJ 1824 Judgment Day 递归搜索

这题就是写个DFS,搞定,比赛的时候没有看到N<=10,不敢暴力,因为这个的复杂度为2^n.看题一定要认真啊啊啊啊!!!!!

枚举所有的可能,每个人都有两种情况,一是spell他的名字,一个是不spell.所以一共有2^n种情况,当然,名字拼不出来就只有一种,就是不spell

.简单吧,用递归写,我一般都把递归写的叫DFS。

贴代码:

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 int n;
 4 int num[30];
 5 int pn[11][30];
 6 int max;
 7 void dfs(int x,int m)
 8 {
 9     if(x == n)
10     {
11         if(m > max) max = m;
12         return;
13     }
14     int i;
15     for(i=0; i<26; ++i)
16     {
17         if(num[i] < pn[x][i])
18             break;
19     }
20     if(i == 26)
21     {
22         for(int j = 0; j< 26; ++j)
23             num[j] -= pn[x][j];
24         dfs(x+1,m+1);
25         for(int j = 0; j< 26; ++j)
26             num[j] += pn[x][j];
27         dfs(x+1,m);
28     }
29     else
30     {
31         dfs(x+1,m);
32     }
33 }
34 int main()
35 {
36 //    freopen("in.cpp","r",stdin);
37     char a[100005],p[100005];
38     int T;
39     scanf("%d",&T);
40     for(int i=1; i<=T; ++i)
41     {
42         scanf("%s",a);
43         int len = strlen(a);
44         memset(num,0,sizeof(num));
45         memset(pn,0,sizeof(pn));
46         for(int k=0; k<len; ++k)
47         {
48             ++num[a[k]-'a'];
49         }
50         scanf("%d",&n);
51         for(int k=0; k<n; ++k)
52         {
53             scanf("%s",p);
54             len = strlen(p);
55             for(int s=0; s<len; ++s)
56             {
57                 ++pn[k][p[s]-'a'];
58             }
59         }
60         printf("Case #%d: ",i);
61         max = 0;
62         dfs(0,0);
63         printf("%d\n",max);
64     }
65     return 0;
66 }
原文地址:https://www.cnblogs.com/allh123/p/3041048.html