D. 505

news/2024/11/29 23:50:49/

传送门

分析

这个道题的题意是给你一个n * m的01矩阵,然后可以更改矩阵中的数字,比如把0改成1,或者把1改成0,要求最后矩阵中没有任何一个边长为偶数的子矩阵中含有偶数个1,如果不含偶数边长的子矩阵,则不需要改动

首先分析一下,我们能找到的最小的子矩阵应该是2 * 2 ,如果一个2 * 2矩阵内含有奇数个1,那么四个2 * 2矩阵拼接形成一个4 * 4矩阵中肯定就含有偶数个1,所以易得出,如果n和m同时大于3,那么一定无法构造出符合题意的矩阵

然后根据题意,n == 1的时候可以特判,所以我们需要讨论的情况只有n = 1的情况和n = 3的情况

首先来看n = 2的情况,如果我们需要让一个2 * 2的小矩阵内的1个数为0,不外乎一下几种情况

第一列:01 11 21 
第二列:11 01 11

所以只需要暴力枚举每一种情况即可

然乎再来分析n = 3的情况
首先每一列有3个数,对应2进制应该是0 - 8,而我们通过分析可以得出在每种状态下下一列可能的情况,分别对应两种,这个时候我们可以通过dp的思路来求解
假设我们把第i列的状态转化成j,那么第i + 1列的状态就只有两种,我们只需要计算出将第i列转化成j状态需要改动多少位数字,将第i + 1列转化为对应的状态需要改动多少位数字,然后两种转移方式取min即可,最后遍历最后一列0 - 8的状态所需要改动的数字的最小值,输出即可

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>using namespace std;const int N = 500006;
char a[4][N];
vector<int> st;
int n,m;
vector<int> g[8];
int f[N][8];int lowbit(int x){ //统计二进制中1的个数return x & -x;
}void res1(){int ans1 = 0,ans2 = 0;for(int i = 0;i < st.size();i += 2){if(st[i] == 0 ||st[i] == 3) ans1++;if((st[i + 1] == 1 || st[i + 1] == 2) && i + 1 < st.size()) ans1++;}for(int i = 0;i < st.size();i += 2){if(st[i] == 1 || st[i] == 2) ans2++;if(i + 1 < st.size() && (st[i + 1] == 0 || st[i + 1] == 3)) ans2++;}printf("%d",min(ans1,ans2));
}void res2(){//各种状态下的转移矩阵g[0] = {5,2};g[1] = {4,3};g[2] = {7,0};g[3] = {1,6};g[4] = {1,6};g[5] = {0,7};g[6] = {4,3};g[7] = {5,2};for (int i = 0; i < 8; i++) {f[0][i] = lowbit(i ^ st[0]); // 统计转移成相应状态需要改动多少位}for(int i = 1;i < st.size();i++)for(int j = 0;j < 8;j++){ //枚举每一种状态f[i][j] = min(f[i - 1][g[j][0]] + lowbit(j ^ st[i]),  //相同为0,不同为1f[i - 1][g[j][1]] + lowbit(j ^ st[i]));//当第i - 1列的状态为g[j][0]或者g[j][1]的时候为合法状态,进行状态转移}int ans = 0x3f3f3f3f;for(int i = 0;i < 8;i++) ans = min(ans,f[st.size() - 1][i]);printf("%d",ans);
}int main(){scanf("%d%d",&n,&m);if(n >= 4 && m >= 4){puts("-1");return 0;}if(n == 1||m == 1){puts("0");return 0;}for(int i = 0;i < n;i++)scanf("%s",a[i]);for(int i = 0;i < m;i++){int x = 0;for(int j = 0;j < n;j++){if(j) x <<= 1;x += a[j][i] - '0';}st.push_back(x);}if(n == 2) res1();else res2();return 0;
}

http://www.ppmy.cn/news/154007.html

相关文章

网络篇汇总

路由器&#xff1a;属于网关设备&#xff0c;通过路由器可以将各种局域网、城域网、广域网连接起来&#xff0c;一般工作于网络层。它会根据信号的情况自动选择和设定路由&#xff0c;以最佳路径&#xff0c;按照前后顺序发送信号。路由器可连接多个逻辑上分开的网络&#xff0…

2种RamDisk的读写速度

以前使用vopt测试速度&#xff0c;结果很难理解 2008-7-16 22:09:28 刚才用vopt9测试了一下硬盘和虚拟盘的速度。。。。。。 07年的pc&#xff08;amd x2 4000 2G 7200转&#xff09; 4个分区的速度为&#xff1a;85/85/76/72M/sgavotte的ramdisk盘X的速度为&#xff1a;160…

Dell(D630)外置麦克风卡拉OK设置

笔记本自带声卡无法唱歌的解决办法声卡 安装了软件&#xff0c;却发现对着话筒说话音箱没声音出来&#xff0c;找了半天原因&#xff0c;才发现原来笔记本自带声卡有缺陷。在音量控制播放属性中根本没有麦克风选项。原来如此&#xff01;于是想到了购买USB声卡&#xff0c;到网…

D530实用小技巧、使用中的问题、app2sd后的问题

【个人心得和D530实用小技巧】&#xff1a;用WIFI上网不稳定&#xff1a;我家刚开始也很不稳定。能正常连接&#xff0c;信号显示很好&#xff0c;但就是上不了网&#xff08;有时又能上&#xff0c;不过90%的时候都上不了&#xff09;。WIFI显示连上但上不了网&#xff0c;是路…

手机专卖平台网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a;

android1.5怎么样,依然采用Android 1.5系统_手机_手机Android频道-中关村在线

依然采用Android 1.5系统 如果你说新生的Android系统不稳定&#xff0c;应用少。那么这种声音在Android 1.5发布以后基本销声匿迹。作为第一个比较稳定的Android系统&#xff0c;1.5系统增加了第三方虚拟键盘&#xff0c;同时增加了widgets效果。进一步加强了chrome lite浏览器…

asus计算机主板,【华硕Z170-A】报价_参数_图片_论坛_ASUS Z170-A华硕主板报价-ZOL中关村在线...

优点&#xff1a; 好的运行平台不仅能兼容众多优秀的硬件产品&#xff0c;还需要具有强大的承载能力。华硕Z170 PRO GAMING主板专为游戏玩家设计&#xff0c;用料扎实、做工出色、性能强劲&#xff0c;附带丰富的玩家特色功能更能为用户带来超凡的游戏体验&#xff0c;相信会是…

android后置双摄像头,双后置摄像头_手机Android频道-中关村在线

处理器方面&#xff0c;HTC One M8装备的是一颗高通骁龙801系列四核心处理器&#xff0c;支持4G LTE网络&#xff0c;拥有四颗Krait 400微架构CPU&#xff0c;单颗CPU主频高达2.5GHz&#xff0c;集成Adreno 330 GPU图形处理单元&#xff0c;并配备2GB RAM内存&#xff0c;内置1…