abc 283E 经典dp

news/2024/7/15 17:35:32 标签: c++, 算法, 图论

题意:https://www.luogu.com.cn/problem/AT_abc283_e

思路:非常经典的dp,设dp[i][j][k]为前i行第i行是否反转和第i+1行是否反转。

/*keep on going and never give up*/
#include<cstdio>
#include<iostream>
#include<queue>
#include<algorithm>
using namespace std;
#define int long long
typedef pair<int, int> pii;
#define lowbit(x) x&(-x)
#define endl '\n'
#define wk is zqx ta die
int a[2][1005][1005];
int dp[1005][2][2];
//int dx[4] = {0, 0, 1, -1};
//int dy[4] = {1, -1, 0, 0};
signed main() {
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			cin >> a[0][i][j];
			a[1][i][j] = 1 - a[0][i][j];
		}
	}
	for (int i = 0; i <= n + 1; i++) {
		a[0][i][0] = a[0][i][m + 1] = a[1][i][0] = a[1][i][m + 1] = 2;
	}
	for (int i = 0; i <= m + 1; i++) {
		a[0][0][i] = a[0][n + 1][i] = a[1][0][i] = a[1][n + 1][i] = 2;
	}
	for (int i = 0; i <= n; i++) {
		for (int j = 0; j <= 1; j++) {
			for (int k = 0; k <= 1; k++) {
				dp[i][j][k] = 1e18;
			}
		}
	}
	dp[0][0][0] = 0;
	dp[0][0][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 g = 0; g <= 1; g++) {
					int ok = 0;
					for (int f = 1; f <= m; f++) {
						int x = a[k][i][f];
						int y = a[j][i - 1][f];
						int z = a[g][i + 1][f];
						int z1 = a[k][i][f + 1];
						int z2 = a[k][i][f - 1];
						if (z1 != x && z2 != x && y != x && z != x) {
							ok = 1;
							break;
						}
					}
					if (ok == 1) {
						continue;
					} else {
						dp[i][k][g] = min(dp[i][k][g], dp[i - 1][j][k] + k);
					}
				}
			}
		}
	}
	int ans = min(dp[n][0][0], dp[n][1][0]);
	if (ans == 1e18) {
		cout << "-1" << endl;
	} else {
		cout << ans << endl;
	}
	return 0;
}


http://www.niftyadmin.cn/n/273341.html

相关文章

【Linux - Shell常用命令】- 判断文件是否存在、去掉文件后缀

目录 一、判断文件是否存在1.1 判断目录是否存在1.2 判断文件是否存在1.3 其他文件类型判断 二、字符串截取&#xff08;去掉文件后缀&#xff09;2.1 获取文件后缀2.2 获取文件前缀 一、判断文件是否存在 1.1 判断目录是否存在 将下面代码保存为dirExist.sh &#xff0c;运行…

力扣---LeetCode21. 合并两个有序链表(链表经典题)

文章目录 前言21. 合并两个有序链表链接&#xff1a;方法一&#xff1a;取小尾插1.1代码&#xff1a;1.2 流程图&#xff1a;1.3 注意&#xff1a; 方法二&#xff1a;带哨兵位2.1代码&#xff1a;2.2流程图&#xff1a; 总结 前言 焦虑不会消除明天的悲伤 只会让你今天的力量…

WRF模式的移植、运行、后处理及在多领域的应用

1、WRF模式的各个组成部分&#xff1b; 2、自主完成该模式的移植&#xff1b;3、自主完成模式运行&#xff1b; 4、自主完成模式后处理&#xff1b;5、通过多领域案例分析、实践&#xff0c;熟悉在多领域中的应用。 随着生态文明建设和“碳中和”战略的持续推进&#xff0c;我…

MSSQL注入利用xp_cmdshell执行命令(细)

目录 介绍 检查我们是否可以堆叠查询 检查权限 阅读命令输出 扩展 介绍 与MySQL不同,MSSQL提供了xp_cmdshell,它允许我们执行系统命令 在xp_cmdshell中,大多数时候我们都有特权使

生成 Cypher 能力:GPT3.5 VS ChatGLM

生成 Cypher 能力&#xff1a;GPT3.5 VS ChatGLM 生成 Cypher 能力&#xff1a;GPT3.5 VS ChatGLM一、 测试结果二、 测试代码&#xff08;包含Prompt&#xff09; Here’s the table of contents: 生成 Cypher 能力&#xff1a;GPT3.5 VS ChatGLM 在之前的文章中已经测试过GPT…

B. I Hate 1111

time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given an integer x&#xfffd;. Can you make x&#xfffd; by summing up some number of 11,111,1111,11111,…11,111,1111,11111,…? …

[oeasy]python0141_自制模块_module_reusability_复用性

自制包内容 回忆上次内容 上次导入了外部的py文件 import my_module 导入一个自己定义的模块 可以使用my_module中的变量 不能 直接使用 my_module.py文件中的变量只要加my_module.作为前缀就可以 直接导入导入变量、函数 from my_module import pi 可以导入my_module.pi 并…

什么是Filter?

Filter&#xff08;过滤器&#xff09;是Java Web中的一种重要组件&#xff0c;可以对请求和响应进行拦截处理&#xff0c;对数据进行过滤和处理。Filter可以实现许多功能&#xff0c;如&#xff1a;鉴权、日志记录、字符编码转换、数据压缩、请求重定向等等。 如何使用Filter…