题目链接: 3的倍数
一、题目描述
给你 nn 个字符串,每个字符串最多包含 A - ZA−Z 这26个字母,KevenKeven 现在取了一些字符串,发现每个字母出现的次数都是 33 的倍数,KevenKeven 现在想要知道在满足每个字母出现的次数都是 33 的倍数的前提下,最多能取多少个字符串。
二、输入描述:
- 第一行一个数字 n,表示字符串的个数(1<=n<=15)
- 接下来 n 行,每行一个字符串 s(1<=strlen(s)<=10000)
三、输出描述:
在一行中输出 KevenKeven 最多能取多少个字符串。
示例1:
- 输入
3
AB
AABBCCC
BB - 输出
2
四、思路
- 因为n比较小,可以直接考虑搜索;
- 我是通过用二维数组保存每一个字符串的每个字母的的个数,首先将所有的字符出现的个数求和,每一次搜素去掉该搜索字符串的所有字符,然后判断是否每一种字符都是3的倍数,如果不是则继续搜下一个字符串,每一次return ;之后对上一次减少的字符进行回溯,这样可以保证能够搜索到最优解;
五、Code
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize(2)
#define ios std::ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);
#define ll long long
const int Max = 1e6+3;
const int mod = 1e9+7;
int n, a[16][26]={0}, ans[26]={0}, maxn = 0;
string s;
void dfs(int x, int y)
{
int book=1;
for(int i=0; i<26; i++)
if(ans[i]%3 != 0) {
book=0; break;
}
if(book) {
maxn = max(n-y, maxn);
}
if(x == n) {
maxn = max(maxn, 0);
return ;
}
for(int j=x; j<n; j++)
{
for(int i=0; i<26; i++)
{
ans[i] -= a[j][i];
}
dfs(j+1, y+1);
for(int i=0; i<26; i++)
{
ans[i] += a[j][i];
}
}
}
int main()
{
ios
cin >> n;
for(int i=0; i<n; i++)
{
cin >> s;
int len = s.length();
for(int j=0; j<len; j++)
{
a[i][s[j]-'A']++;
ans[s[j]-'A']++;
}
}
dfs(0, 0);
cout << maxn << endl;
return 0;
}
蒟蒻一只,欢迎指正