NowCoder 练习 —— 3的倍数(DFS + 回溯)

题目链接: 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;
}

蒟蒻一只,欢迎指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值