【状态机dp 动态规划】100290. 使矩阵满足条件的最少操作次数

本文涉及知识点

动态规划汇总
状态机dp

LeetCode100290. 使矩阵满足条件的最少操作次数

给你一个大小为 m x n 的二维矩形 grid 。每次 操作 中,你可以将 任一 格子的值修改为 任意 非负整数。完成所有操作后,你需要确保每个格子 grid[i][j] 的值满足:
如果下面相邻格子存在的话,它们的值相等,也就是 grid[i][j] == grid[i + 1][j](如果存在)。
如果右边相邻格子存在的话,它们的值不相等,也就是 grid[i][j] != grid[i][j + 1](如果存在)。
请你返回需要的 最少 操作数目。
示例 1:
输入:grid = [[1,0,2],[1,0,2]]
输出:0
解释:
矩阵中所有格子已经满足要求。
示例 2:
输入:grid = [[1,1,1],[0,0,0]]
输出:3
解释:
将矩阵变成 [[1,0,1],[1,0,1]] ,它满足所有要求,需要 3 次操作:
将 grid[1][0] 变为 1 。
将 grid[0][1] 变为 0 。
将 grid[1][2] 变为 1 。
示例 3:
输入:grid = [[1],[2],[3]]
输出:2
解释:
这个矩阵只有一列,我们可以通过 2 次操作将所有格子里的值变为 1 。
提示:
1 <= n, m <= 1000
0 <= grid[i][j] <= 9

原理

本题 ⟺ \iff 各列相同,相邻列不等。
操作后,一定存在最优解,各列的值全部 ∈ \in [0,9]。
将某列全部变成x,需要的操作次数 n - cnt[x],如果x<0或x>9,则cnt[x]一定为0。故将x换成y(y ∈ \in [0,9]),操作次数只会减少或不变。
如果某个最优解第col列小于0或大于9。则换成[0,9]之内和col-1列,col+1列不同的数。

动态规划

动态规划的状态表示

pre[iPre]表示处理完前c列,以iPre结束的最少操作次数。
dp[cur]表示处理完前c+1列,以cur结束的最少操作次数。
空间复杂度:O(10)

动态规划的转移方程

dp[cur] = min ⁡ x : 0 , x ! = c u r 9 p r e [ x ] + n − c n t [ c u r ] \min_{x:0,x!=cur}^9pre[x]+n-cnt[cur] minx:0,x!=cur9pre[x]+ncnt[cur]
时间复杂度:O(nm+10 × \times ×m × \times × 10)

动态规划的初始值

pre全为0。

动态规划的填表顺序

从第0列到最后一列。

动态规划的返回值

pre的最小值。

代码

template<class ELE,class ELE2>
void MinSelf(ELE* seft, const ELE2& other)
{*seft = min(*seft,(ELE) other);
}template<class ELE>
void MaxSelf(ELE* seft, const ELE& other)
{*seft = max(*seft, other);
}class Solution {
public:int minimumOperations(vector<vector<int>>& grid) {m_r = grid.size();m_c = grid[0].size();vector<int> pre(10);for (int c = 0; c < m_c; c++) {int cnt[10] = { 0 };for (int r = 0; r < m_r; r++) {cnt[grid[r][c]]++;}vector<int> dp(10,2'000'000);for (int iPre = 0; iPre < 10; iPre++) {for (int cur = 0; cur < 10; cur++) {if (iPre == cur) { continue; }MinSelf(&dp[cur], pre[iPre] + m_r - cnt[cur]);}}pre.swap(dp);}return *std::min_element(pre.begin(), pre.end());}int m_r, m_c;
};

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

我想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

【Qt 学习笔记】Qt常用控件 | 显示类控件 | Label的使用及说明

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt常用控件 | 显示类控件 | Label的使用及说明 文章编号&#xff1a;Q…

Opencv Python图像处理笔记一:图像、窗口基本操作

文章目录 前言一、输入输出1.1 图片读取显示保存1.2 视频读取保存1.3 文件读取保存 二、GUI2.1 窗口2.2 轨迹条2.3 画图2.4 鼠标回调 三、图像入门操作3.1 颜色空间转化3.2 通道分离合并3.3 添加边框3.4 算数操作 四、二值化4.1 普通4.2 自适应4.3 Otsu 参考 前言 随着人工智能…

mysql基础3——创建和修改数据表

创建数据表 创建一个表&#xff08;importtype有默认值1&#xff09;并插入一条数据&#xff08;importtype字段没有指定值&#xff09; 约束 默认约束&#xff08;把设置的默认值自动赋值给字段&#xff09; create table demo.importhead(listnum int,supplied int,stock…

C++进修——C++基础入门

初识C 书写HelloWorld #include <iostream> using namespace std;int main() {cout << "HelloWorldd" << endl;system("pause");return 0; }注释 作用&#xff1a;在代码中加一些说明和解释&#xff0c;方便自己或其他程序员阅读代码…

docker打包部署自己的应用

docker部署应用 当谈及使用 Docker 进行容器化部署应用时&#xff0c;可以想象它是一个能够将整个应用程序及其所有依赖项打包成一个独立、可移植的容器的工具。这个容器不仅包含了应用代码&#xff0c;还包括了操作系统、运行时环境以及所有依赖的库和组件。这样一来&#xf…

双工结构(duplex construction)

参考文献&#xff1a; [BDPV11] Bertoni G, Daemen J, Peeters M, et al. Duplexing the sponge: single-pass authenticated encryption and other applications[C]//Selected Areas in Cryptography: 18th International Workshop, SAC 2011, Toronto, ON, Canada, August 1…

mybatis创建入门流程体验

mysql数据库中建表 drop table if exists tb_user;create table tb_user(id int primary key auto_increment,username varchar(20),password varchar(20),gender char(1),addr varchar(30) );INSERT INTO tb_user VALUES (1, zhangsan, 123, 男, 北京); INSERT INTO tb_user …

星域社区原版APP源码/社区交友App源码/动态圈子群聊php源码

简介 初始版本是由RuleAPP规则之树开发的&#xff0c;而星域社区则是在此基础上进行了二次开发和美化。作者花了近一年的时间来打磨它&#xff0c;现在即将推出Pro版。如果你只想免费使用的话&#xff0c;可以使用原始的RuleAPP版本。但是&#xff0c;如果你想要获得更好的美观…

【YOLOv9】实战二:手把手教你使用TensorRT实现YOLOv9实时目标检测(含源码)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f4d1;上期文章&#xff1a;『【YOLOv9】实战一&#xff1a;在 Windows 上使用LabVIEW OpenVINO工具…

CTF工具处理(2)--HackBar报错

来源&#xff1a;HackBar插件绕许可_hackbar许可证-CSDN博客 报错页面&#xff1a; 工具报错原因&#xff1a; 版本升级&#xff0c;需要收费。 破解&#xff1a; 1.下载文件&#xff08;去网上找破解HackBar&#xff09; 2.添加附件&#xff1a; 3.重启&#xff1a; 按F12就…

引领4G拾音新时代:DuDuTalk双定向拾音设备上市,助力现场管理步入智能化

近日&#xff0c;继DuDuTalk的4G智能拾音工牌&#xff08;挂牌和胸牌&#xff09;之后&#xff0c;赛思云科技在线下沟通场景智能语音采集方案领域的又一突破性产品4G双定向桌面拾音终端全新上市。 该产品是面向营业网点、市政大厅、医疗诊室、售票窗口、贵宾室等环境的柜台服…

【工具-pip】

工具-pip ■ pip-工具■ pip-安装■ pip-卸载■ pip-帮助■ pip- 批量安装库■ 批量卸载库■ 提高pip下载速度 ■ pip-工具 pip 是 Python 标准库中的一个包&#xff0c;这个包是用来管理 Python 第三方库。 通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、…

cesium 动态线效果

一、扩展材质 function PolylineTrailMaterial(options) {options Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);this._definitionChanged new Cesium.Event();// 变量初始化this.color Cesium.defaultValue(options.color && new Cesium.Colo…

基于区间预测的调度方法

《基于区间预测的光伏发电与蓄电池优化调度方法》 为了应对县级市光伏发电与用电需求之间的最优调度问题&#xff0c;提出一种面向蓄电池和光伏发电机的区间预测调度优化方法。该方法分别对发电功率调度、充电/放电功率调度和荷电状态调度进行决策从而获得最优调度的精确范围。…

Python Flask Web框架快速入门

Flask 入门Demo Flask 开发环境搭建&#xff0c;执行如下指令&#xff1a; pip install flask # 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run() 核心代码剖析&#xff1a; 从 fla…

RTSP/Onvif视频监控平台EasyNVR如何提高匿名用户的用户名和密码安全性?

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

Nginx+Lua+OpenResty(详解及使用)

一、 Nginx简介 Nginx是一个高性能的Web服务器和反向代理的软件。 Web服务器&#xff1a;就是运行我们web服务的容器&#xff0c;提供web功能&#xff0c;还有tomcat也提供类似的功能。 代理是软件架构和网络设计中&#xff0c;非常重要的一个概念。 二、Nginx的反向代理&…

flutter 谷歌的苹果系统消息推送

flutter firebase 云消息通知教程 (android-安卓、ios-苹果) Android、ReactNative、Flutter集成Firebase推送注意事项 Android&#xff1a;Firebase 凭据 iOS&#xff1a;基于 p8 令牌的 APN 连接 iOS&#xff1a;p12 生成证书 Flutter之对接国外推送onesignal踩坑笔记&a…

0.C++入门(专栏前言)

目录 1.什么是C 2.C的发展史 3.C的重要性 应用&#xff1a; 4.如何学习C 5.关于本专栏 1.什么是C 20世纪80年代&#xff0c;计算机界提出oop(object oriented programming:面向对象&#xff09;思想&#xff0c;支持面向对象的程序设计应运而生。 1982年&#xff0c;本…

Java实现文件分片上传、大文件秒传

Java实现文件分片上传、大文件秒传&#xff0c;大文件如何做断点续传&#xff1f;JAVAWEB 文件上传及下载&#xff0c;JAVA大文件上传&#xff0c;大文件下载解决方案&#xff0c;JAVA实现文件分片上传并且断点续传&#xff0c;JAVA大文件分片上传/多线程上传功能&#xff0c;超…