dfs题集

 1 #include<cstdio>
 2 #include<vector>
 3 #include<algorithm>
 4 #include<iostream>
 5 #include<cstring>
 6 using namespace std;
 7 typedef long long LL;
 8 int mp[20][30];
 9 int now[30];
10 char s[100010];
11 int n, ans;
12 void dfs(int root, int sum)
13 {
14     if (root > n)
15     {
16         bool flag = 1;
17         for (int i = 'A';i <= 'Z';i++)
18         {
19             if (now[i - 'A'] % 3 != 0) { flag = 0;break; }
20         }
21         if (flag) ans = max(ans, sum);
22         return;
23     }
24     for (int i = 'A';i <= 'Z';i++)
25     {
26         now[i - 'A'] = (now[i - 'A'] + mp[root][i - 'A']);//加上改组
27     }
28     dfs(root + 1, sum + 1);
29     for (int i = 'A';i <= 'Z';i++)
30     {
31         now[i - 'A'] = (now[i - 'A'] - mp[root][i - 'A']);//因为前面加上了,所以如果改组不要就减去。
32     }
33     //通过上述方法就可以dfs出每个字符串要和不要的情况
34     dfs(root + 1, sum);
35 }
36 int main()
37 {
38 
39     cin >> n;
40     for (int i = 1;i <=n;i++)
41     {
42         cin >> s;
43         int len = strlen(s);
44         for (int j = 0;j < len;j++)
45         {
46             mp[i][s[j] - 'A']++;
47         }
48     }
49     dfs(1, 0);
50     cout << ans;
51     return 0;
52 }
View Code

 

posted @ 2020-02-21 13:42  programmer_w  阅读(0)  评论(0)    收藏  举报