练习:二进制枚举加贪心

该问题描述了一个矩阵消除游戏,玩家牛妹可以在k个回合内选择消除行或列以增加分数。为了最大化得分,可以先按权值降序排列行或列,然后在限制的回合数内消除。代码示例展示了如何通过枚举和贪心策略来计算最大得分。
摘要由CSDN通过智能技术生成

例题

题目描述

牛妹在玩一个名为矩阵消除的游戏,矩阵的大小是n行m列,第i行第j列的单元格的权值为a[i][j],牛妹可以进行k个回合的游戏,在每个回合,牛妹可以选择一行或者选择一列,然后将这一行或者这一列的所有单元格中的权值变为0,同时牛妹的分数会加上这一行或者这一列中的所有单元格的权值的和。

牛妹想最大化她的得分,球球你帮帮她吧!

输入描述:

第一行三个整数n,m,k
接下来n行每行m个整数表示矩阵中各个单元格的权值。

输出描述:

输出一个整数表示牛妹能获得的最大分数。

如果只能选择行或者列的话,只要从大到小选择即可,因此我们只要枚举出行或者列的所有情况,再对另一个方向的进行贪心选择即能得出最大的分数。

代码:

#include<bits/stdc++.h>
using namespace std;
int a[16][16];
int aa[16];
int bb[16];
int cc[16];
bool cmp(int x,int y)
{
	return x > y;
}
int main()
{
	int n,m,k;cin >> n >> m >> k;
	int tsum = 0;
	for(int i = 1;i <= n;i++)
	for(int j = 1;j <= m;j++)
	{
		cin >> a[i][j];
		tsum += a[i][j];
		aa[i] += a[i][j];
		bb[j] += a[i][j];
	}
	if(k >= min(n,m))
	cout << tsum;
	else//枚举后贪心
	{
		int ma = 0;
		for(int i = 0;i < (1 << n);i++)
		{
			int nn = 0;
			for(int t = 1;t <= m;t++)
			cc[t] = bb[t];
			int sum = 0;
			int ii = i;
			int l = 0;
			while(ii)
			{
				if(ii & (1 << l++))
				{
					for(int t = 1;t <= m;t++)
					cc[t] -= a[l][t];
					nn++;
					sum += aa[l];
					ii -= (1 << (l - 1));
				}
			}
			if(k - nn >= 0)
			{
				sort(cc + 1,cc + 1 + m,cmp);
				for(int t = 1;t <= k - nn;t++)
				sum += cc[t];
				ma = max(sum,ma);
			}
		}
		cout << ma;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值