蓝桥杯备考---》贪心算法之矩阵消除游戏

我们第一次想到的贪心策略一定是找出和最大的行或者列来删除,每次都更新行和列

比如如图这种情况,这种情况就不如直接删除两行的多,所以本贪心策略有误

so我们可以枚举选的行的情况,然后再贪心的选择列和最大的列来做

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,k;
typedef long long ll;
const int N = 20;

int sum;

int col[N];
int a[N][N];


	int calc(int x)
{
 int ret = 0;
 while(x)
 {
 ret++;
 x -= x & -x; 
 }
 return ret;
}

bool cmp(int x,int y)
{
	return x>y;
}
int ret;

int main()
{
	cin >> n >> m >> k;
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<m;j++)
		{
			cin >> a[i][j];
		}
	}
	for(int st = 0;st<(1<<n);st++)
	{
		memset(col,0,sizeof(col));
		sum = 0;
		if(calc(st)>k) continue;
		for(int i = 0;i<n;i++)
		{
			for(int j = 0;j<m;j++)
			{
				if((st>>i)&1) sum+=a[i][j];
				else col[j]+=a[i][j];
			}
		}
		sort(col,col+m,cmp);
		int tmp = k-calc(st);
		for(int i = 0;i<tmp;i++)
		{
			sum+=col[i];
		}
		ret = max(ret,sum);
		
	}
	cout << ret; 
	
	
	
	
	return 0;
}

这样写是有bug的,我们选列的时候有可能会越界

因为我们的k最高是n*m,假如不选行,全选列,列是不够选的啊,我们应该对col的遍历范围做点限制,不能超过m

正确代码√

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,k;
typedef long long ll;
const int N = 20;
int a[N][N];
int sum;
int col[N];




	int calc(int x)
{
 int ret = 0;
 while(x)
 {
 ret++;
 x -= x & -x; 
 }
 return ret;
}

bool cmp(int x,int y)
{
	return x>y;
}
int ret;
int main()
{
	cin >> n >> m >> k;
	for(int i = 0;i<n;i++)
	{
		for(int j = 0;j<m;j++)
		{
			cin >> a[i][j];
		}
	}
	for(int st = 0;st<(1<<n);st++)
	{
		memset(col,0,sizeof(col));
		sum = 0;
		if(calc(st)>k) continue;
		for(int i = 0;i<n;i++)
		{
			for(int j = 0;j<m;j++)
			{
				if((st>>i)&1) sum+=a[i][j];
				else col[j]+=a[i][j];
			}
		}
		sort(col,col+m,cmp);
		int tmp = k-calc(st);
		for(int i = 0;i<min(tmp,m);i++)
		{
			sum+=col[i];
		}
		ret = max(ret,sum);
		
	}
	cout << ret; 
	
	
	
	
	return 0;
}
相关推荐
徐小夕3 小时前
花了3个月,我们做了一款 AI 版的“飞书文档”
前端·算法·github
Robert--cao3 小时前
移动底盘与机械臂联合规划:开源算法与工程实现
算法
小豆庄4 小时前
Mac 上给视频人脸打码:本地工具的依赖、追踪与推理管线
算法·视觉检测·视频·敏捷流程·纹理贴图
星夜离尘564 小时前
MATLAB 工程实验:从相邻块均值手写重叠 Allan 偏差,数清有效项
算法·matlab·均值算法
y1su6 小时前
Leetcode 字符串模板
java·数据结构·算法·leetcode·职场和发展·动态规划
residual_fan7 小时前
船用柴油机动态机动工况故障诊断:控制感知仿射网络(CAAN)的技术实现
人工智能·算法·数据挖掘·数据分析
电子云与长程纠缠7 小时前
UE5魂系游戏开发教程05
开发语言·学习·游戏·ui·ue5
其实防守也摸鱼7 小时前
Cylab在线靶场——CTF中的通用技能
linux·数据库·学习·算法·靶场·ctf·学习网络安全
蓝悦无人机7 小时前
《Planning algorithms》读书笔记——第8章 反馈运动规划
算法·读书笔记·反馈运动规划
RaaS1008 小时前
Agent Skills 进了 Linux Foundation:2.8 亿次安装,但装 skill 还没有安全规范
人工智能·算法·架构