[ABC283E] Don‘t Isolate Elements

news/2025/1/18 21:54:45/文章来源:https://www.cnblogs.com/zzzsacmblog/p/18678921

题目:

思路:
很明显总的情况是2^h*w种,然后不难发现改变一行只会影响到相邻两行,也就是说前面的决策不会影响到后面的决策,只有当前面的决策全部合理才能走后一步。
所以取dp:dp[i][j][k]为前i行,j(当前行是1/0否改变),k(当前行的前一行是1/0否改变)。
所以有递推式:dp[i][j][k]=min(dp[i-1][k][l]+j,dp[i][j][k])。
此时k对应的是i-1行的状态。
最后检查:四种状态下,最后一行是否满足(之所以要检查是因为前面只检查到i-1行的合法性),如果满足就取最小值,注意题目最多翻转h次,所以可以设置大数来检验是否有效。
代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<string.h>
#include<string>
#include<vector>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
#define int long long
const int INF = 0x3f3f3f3f3f3f;
const int N = 1e3 + 10;
int h, w;
int mp[N][N];
int delta[][2] = {{0,1},{0,-1},{1,0},{-1,0}};
//前i行是否操作的最小次数
int dp[N][2][2];//判断第x行是否有孤立点,无孤立点就true
bool jd(int x,int bef,int now,int nx)
{for (int i = 1; i <= w; i++){int cntb = 0;for (int j = 0; j < 4; j++){int dx = delta[j][0], dy = delta[j][1];int nowVal = (now) ? 1 - mp[x][i] : mp[x][i];if (x + dx > 0 and x + dx <= h and i + dy > 0 and i + dy <= w){int jdval = 0;int y = i + dy;if (dx == -1)jdval = (bef) ? 1 - mp[x + dx][y] : mp[x + dx][y];else if (dx == 1)jdval = nx ? 1 - mp[x + dx][y] : mp[x + dx][y];else jdval= (now) ? 1 - mp[x][y] : mp[x][y];if (jdval == nowVal)cntb++;}}if (cntb == 0)return false;}return true;
}signed main()
{IOS;cin >> h >> w;for (int i = 1; i <= h; i++)for (int j = 1; j <= w; j++)cin >> mp[i][j];memset(dp, INF, sizeof(dp));//首先确定前两行的情况,然后再递推后面的,dp[1][1][0] = 1;dp[1][0][0] = 0;for (int i = 2; i <= h; i++){for (int j = 0; j < 2; j++){for (int k = 0; k < 2; k++){for (int l = 0; l < 2; l++){if (jd(i - 1, k, j, l))dp[i][l][j] = min(dp[i - 1][j][k] + l, dp[i][l][j]);}}}}//最后检验最后一行是否能没有孤立点int ans = INF;for (int i = 0; i < 2; i++)for (int j = 0; j < 2; j++)if (jd(h, j, i, 0))ans = min(ans, dp[h][i][j]);if (ans <=h)cout << ans;else cout << -1;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871452.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 nuget 私服 BaGet 中应用https 以及 gitea action runner 自动打包

最近赋闲,想起之前工作中代码管理的一点经历,就是在打包项目的时候,类库的版本号几乎没变过,一个项目运行多少年了,版本号还是1.0.0。😂 即使用到了 nuget 私服,基本上也是手动打包的,CI 工具基本都是用到 api 项目。于是想结合 gitea 的 CI 工具 act runner 试用一下…

记录一下双多控开关接法

实际上双控就是单刀双掷开关,多控就是双刀双掷开关。多控里L1A+L1B是输入的俩个接上级出来的俩根线,LA和LB是反着的接上总有一路能通。输入俩通道输出俩通道所以可以无限串联。实际上双控就是单刀双掷开关,多控就是双刀双掷开关。 多控里L1A+L1B是输入的俩个接上级出来的俩根…

Day 7

1月17日,继续看了一些SpringBoot视频, SpringBoot的实现步骤SpringBoot项目的起步依赖 <!-- springboot工程需要继承的父工程 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifac…

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴

如果通过 vxe-table 实现 Excel,可以和 Excel、WPS 复制粘贴 官网:https://vxetable.cn<template><div><vxe-gridref="gridRef"v-bind="gridOptions"@cell-area-selection-end="cellAreaSelectionEndEvent"@cell-area-extensio…

树(基础)

树 1 定义 1.1 树是什么 树是一种数据结构,因为形似倒着的树而得名. 1.2 树的定义 递归定义 1.2.1 有根树的定义 形象化的,如图1,有根树存在根节点这一定义,从根节点可以分出任意个分支,这任意个分支又可以继续细分,分出的节点称为“子节点”。抽象化的,树也是\(N\)…

Java五子棋源码联网版+Socket+Swing+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 Java五子棋源码联网版 源码,看图: 实现了服务端和客户端。是联网版游戏基础模型。环境 JDK1.8代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git整体代码结构服务器采…

Java源码:实现斗地主游戏+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 斗地主 源码,看图:视频演示效果 https://githubs.xyz/show/5.mp4 环境 JDK1.8代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git项目结构 代码十分简洁,只有简单的7个…

文件蜈蚣 后台偷跑流量

我已经好久没有打开这个软件了,期间重启了很多次,他有一个服务应该开机时就启动,后台偷跑流量 filec.exe文件。 因为我没什么什么上传流量也很大,最终定位到这个文件在偷跑了。

windows安装ffmpeg

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。 ffmpeg安装 打开 FFmpeg 官网,选择下载。 选择 Windows 平台,下面有两个链接,都是可以的,选择其一。 本文以点…

Java源码:坦克大战+swing界面+大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 坦克大战 源码,看图: 演示视频 https://githubs.xyz/show/22.mp4 环境 JDK1.8 实现步骤代码采用原生java类库编写,界面采用swing,完整源码获取地址: gitee.com/hadluo/java_game01.git启动类 启动类是 TankCline…

免费下载CapCut海外版,解锁剪映VIP功能无广告

大家好,今天给大家带来一个超级实用的教程——剪映海外版 CapCut 下载:免费解锁剪映 VIP 功能的完整步骤!剪映是目前非常流行的视频编辑软件,它让我们的短视频创作变得更加简单和高效。不管是记录生活点滴、制作旅行回忆,还是做一些创意短视频,剪映都提供了非常强大的功能…

Java源码:植物大战僵尸 + 大学生练手项目

前言 学Java的朋友们,福利来了,今天小编给大家带来了一款 植物大战僵尸源码,看图:视频演示 https://githubs.xyz/show/175.mp4 环境 JDK1.8代码采用原生java类库编写,完整源码获取地址: gitee.com/hadluo/java_game01.git类继承UML图源码实现 我们先从main函数看起,继承了…