E - Don't Isolate Elements (atcoder.jp)

题意:

题意:

定义孤独的数为,该数上下左右的数都和它相反

给定一个01矩阵,每次操作可以把某一行的数取反,问你把该矩阵变成没有孤独的数的最少操作次数是多少

思路:

一开始想用贪心,但是贪心想不清楚,于是去考虑dp

它是一行一行操作的,因此它是按行去划分阶段

对于某一行,我们有没有必要去取反,取决于上一层的状态

即第i-1层的状态影响了第i层的决策

因此我们定义状态为:dp[i][j],表示考虑操作前i行,使前i行没有孤独的数的最少操作次数,其中第i-1行的取反状态为j

然后考虑转移方程,第i层如果能和第i-1层合法,即和上一层搭配不会有孤独的数出现,就考虑转移

对于DP问题的枚举顺序,一般是先去枚举阶段,然后枚举状态,最后去枚举决策

所以我们先去枚举行,然后枚举该层的取反状态,最后枚举上一层的取反状态

其中0表示没有取反,1表示已经取反,然后把a[i]异或上状态,就是操作之后的数了

用异或取反这个trick好像挺方便的,表示是否取反

这个其实很像状压DP的感觉,只不过这里每一行的状态很少

for(int i=1;i<=n;i++){for(int j=0;j<=1;j++){for(int k=0;k<=1;k++){for(int v=0;v<=1;v++){if(check(i,j,k,v)){dp[i][j][k]=min(dp[i][j][k],dp[i-1][k][v]+j);}}}}}

然后另一个难点是怎么去check

其实思路很简单,就是容易写错QwQ

check函数里面就是去枚举列,对于该列如果和上下两行有孤独的数出现,不合法,否则就合法

注意第一行和最后一行的特判,这两行没有上一行和下一行

最后去枚举状态,统计最小值即可,如果是无穷就是-1

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mxn=2e3+10;
int n,m;
int a[mxn][mxn],dp[mxn][2][2];
bool check(int c,int x,int y,int z){c--;if(c==0){return true;}else if(c==1){for(int i=1;i<=m;i++){int ok=0;if((a[c][i]^y)==(a[c+1][i]^x)) ok=1;if(i+1<=m&&a[c][i]==a[c][i+1]) ok=1;if(i-1>=1&&a[c][i]==a[c][i-1]) ok=1;if(!ok) return false;}return true;}else if(c!=n-1){for(int i=1;i<=m;i++){int ok=0;if(((a[c][i]^y)==(a[c+1][i]^x))||(a[c][i]^y==a[c-1][i]^z)) ok=1;if(i+1<=m&&a[c][i]==a[c][i+1]) ok=1;if(i-1>=1&&a[c][i]==a[c][i-1]) ok=1;if(!ok) return false;}return true;}else{c++;for(int i=1;i<=m;i++){int ok=0;if((a[c][i]^x)==(a[c-1][i]^y)) ok=1;if(i+1<=m+1&&a[c][i]==a[c][i+1]) ok=1;if(i-1>=1&&a[c][i]==a[c][i-1]) ok=1;if(!ok) return false;}return true;}
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cin>>a[i][j];}memset(dp,0x3f,sizeof(dp));dp[0][0][0]=dp[0][0][1]=dp[0][1][0]=dp[0][1][1]=0;for(int i=1;i<=n;i++){for(int j=0;j<=1;j++){for(int k=0;k<=1;k++){for(int v=0;v<=1;v++){if(check(i,j,k,v)){dp[i][j][k]=min(dp[i][j][k],dp[i-1][k][v]+j);}}}}}int ans=1e18;for(int j=0;j<=1;j++){for(int k=0;k<=1;k++) ans=min(ans,dp[n][j][k]);}if(ans==1e18) ans=-1;cout<<ans<<'\n';
}

AtCoder Beginner Contest 283 E - Don‘t Isolate Elements相关推荐

  1. AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...

  2. AtCoder Beginner Contest 197 题解(A ~ F)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...

  3. AtCoder Beginner Contest 198 (A ~ F)题解

    目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...

  4. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

  5. AtCoder Beginner Contest 215 F - Dist Max 2

    AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi​,yi​),定义两点(xi,yi),(xj,yj)(x ...

  6. AtCoder Beginner Contest 215 E - Chain Contestant

    AtCoder Beginner Contest 215 E - Chain Contestant 给出一个只包括A~J的字符串,定义一种子序列为:在这个子序列中,相同的字符必定连续出现,求出这样的子 ...

  7. AtCoder Beginner Contest 204 F Hanjo 2

    AtCoder Beginner Contest 204 F Hanjo 2 H宽,W长的二维平面上,用1 * 1或者2 * 1的地砖来铺,要求铺满,求出方案数. 数据范围H <= 6, W & ...

  8. Caddi Programming Contest 2021(AtCoder Beginner Contest 193) 题解

    Caddi Programming Contest 2021(AtCoder Beginner Contest 193) A - Discount 打折浮点数除即可 B - Play Snuke 枚举 ...

  9. Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

    文章目录 A - Tiny Arithmetic Sequence B - Do you know the second highest mountain? C - Secret Number D - ...

最新文章

  1. 强大的Charles的使用,强大的flutter1.9
  2. 学会python爬虫怎么赚钱-自学python爬虫赚钱经历
  3. FreeMarker 自动转义和格式化HTML和XML输出,预防xss
  4. linux 初始化内存管理_Linux内存管理第二章 -- Describing Physical Memory
  5. docker 容器重命名
  6. 【转】jmeter响应结果乱码问题
  7. PHP实现redis限制单ip、单用户的访问次数功能
  8. 小技巧:用python迅速打印Java写 的Flink代码中的hive建表语句
  9. php 自动分配数据到个人,数据表格自动分配列宽的一种实现方法
  10. Android 8.0 学习(23)---recovery 流程分析
  11. vim编码设置问题(转)
  12. git push 报错git: push-u is not a git command. See 'git --help'.
  13. 一款可以安利的MarkDown编辑器
  14. jquery项目中一些比较常用的简单方法
  15. java编程菜鸟入门01
  16. Qt网络编程——TCP
  17. 男人动心的3种傻女孩[转载]
  18. Mathtype在word中编辑公式时变成英文
  19. python问题解决:TypeError: ufunc 'add' output (typecode 'O') could not be coerced to provided output para
  20. 操作系统虚拟内存的作用概括

热门文章

  1. android 虚拟器版本,安卓虚拟机Android-X86更新至4.4版本
  2. 电力电子技术 学习总结1
  3. python取得两个文件的交集、并集和差集。
  4. AI时代下如何治愈艾滋病?
  5. 使用Matplotlib进行Python绘图(指南)
  6. iPad国内降价!在内地开启教育优惠
  7. python大学编程考试题及答案_大学慕课2020年Python编程基础题目及答案
  8. 《Python语言程序设计》王恺 王志 李涛 机械工业出版社 第4章 面向对象 课后习题答案【强烈推荐】
  9. 【ML】线性回归 [多因子](LinearRegression)实践(基于sklearn)
  10. 【Java基础】NoClassDefFoundError 和 ClassNotFoundException的定义及其区别