2021.12.11 刷颜色

这篇博客探讨了一个关于颜色矩阵的问题,其中矩阵由白色和黑色方格组成。目标是找出能将矩阵中黑色方格数量变为K的不同选择次数。博主指出,直接暴力求解可能会导致超时,因此提出了利用二进制表示和状态压缩的思想来降低复杂度,强调了二进制位运算在解题中的关键作用,并提供了通过AC的代码示例。
摘要由CSDN通过智能技术生成

【题目描述】

我们有一个 H 行 W 列的矩阵方格(1≤H,W≤6),行号是从上往下编号,列号是从左往右 编号。 第 i 行第 j 列位置小方格的颜色用字符 Ci,j给出(1≤i≤H;1≤j≤W;Ci,j 为’.’或’#’):

⚫ 如果 Ci,j为字符 ’.’,则该小方格为白色;

⚫ 如果 Ci,j为字符 ’#’,则该小方格为黑色;

考虑执行以下操作: •选择多行(也可能不选行)和多列(也可能不选列),然后将所选行中的所有格子和所 选列中的所有格子都涂成红色。 给你一个正整数 K(1≤K≤H×W),问你有多少次不同的选择,会导致每个选择的操作 结果都只剩下 K 个黑色方格?

本题看似数据范围很小,但是用暴力来做不仅可能超时,而且无从下手。所以转换思路,从另一方面求解。其实对于每一行,每一列,都只有刷或者不刷两种情况。所以很容易联想到利用二进制进行表示每一次选择的情况,行的粉刷情况和列的粉刷情况用两个数字表示(好吧这其实很难想到),所以每个二进制数都有唯一的十进制数与之一一对应;而用二进制表示情况转换为十进制再进行循环就大大减少的复杂度了

这其实就是状态压缩的思想

对于二进制,对于位运算也是解题的关键

附上AC代码

#include<bits/stdc++.h>
using namespace std;
int sum,ans,cnt;
char a[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值