【动态规划】【逆向思考】【C++算法】960. 删列造序 III

作者推荐

【动态规划】【map】【C++算法】1289. 下降路径最小和 II

本文涉及知识点

动态规划汇总

LeetCode960. 删列造序 III

给定由 n 个小写字母字符串组成的数组 strs ,其中每个字符串长度相等。
选取一个删除索引序列,对于 strs 中的每个字符串,删除对应每个索引处的字符。
比如,有 strs = [“abcdef”,“uvwxyz”] ,删除索引序列 {0, 2, 3} ,删除后为 [“bef”, “vyz”] 。
假设,我们选择了一组删除索引 answer ,那么在执行删除操作之后,最终得到的数组的行中的 每个元素 都是按字典序排列的(即 (strs[0][0] <= strs[0][1] <= … <= strs[0][strs[0].length - 1]) 和 (strs[1][0] <= strs[1][1] <= … <= strs[1][strs[1].length - 1]) ,依此类推)。
请返回 answer.length 的最小可能值 。
示例 1:
输入:strs = [“babca”,“bbazb”]
输出:3
解释:
删除 0、1 和 4 这三列后,最终得到的数组是 strs = [“bc”, “az”]。
这两行是分别按字典序排列的(即,strs[0][0] <= strs[0][1] 且 strs[1][0] <= strs[1][1])。
注意,strs[0] > strs[1] —— 数组 strs 不一定是按字典序排列的。
示例 2:
输入:strs = [“edcba”]
输出:4
解释:如果删除的列少于 4 列,则剩下的行都不会按字典序排列。
示例 3:
输入:strs = [“ghi”,“def”,“abc”]
输出:0
解释:所有行都已按字典序排列。
提示:
n == strs.length
1 <= n <= 100
1 <= strs[i].length <= 100
strs[i] 由小写英文字母组成

动态规划

逆向思考:最少删除就是最多保留。

动态规划的状态表示

dp[i]表示,以第i列结尾的最长序列的最长长度。
## 动态规划的的转移方程
dp[i] =Max j = 0 : i − 1 全部第 i 列大于等于第 j 列 \Large_{j=0:i-1}^{全部第i列大于等于第j列} j=0:i1全部第i列大于等于第j(pre[j+1)

代码

核心代码

class Solution {
public:int minDeletionSize(vector<string>& strs) {m_c = strs.front().size();vector<int> dp(m_c,1);for (int i = 1; i < m_c; i++){for (int j = 0; j < i; j++){if (GreateEqual(strs, i, j)){dp[i] = max(dp[i], dp[j] + 1);}}}return strs[0].length()- *max_element(dp.begin(),dp.end());}bool GreateEqual(const vector<string>& strs, int i,int j){for (const auto& s : strs){if (s[i] < s[j]){return false;}}return true;}int m_c;
};

测试用例

template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{	vector<string> strs;{Solution sln;strs = { "abbba" };auto res = sln.minDeletionSize(strs);Assert(res, 1);}{Solution sln;strs = { "babca", "bbazb" };auto res = sln.minDeletionSize(strs);Assert(res,3);}{Solution sln;strs = { "edcba" };auto res = sln.minDeletionSize(strs);Assert(res, 4);}{Solution sln;strs = { "ghi","def","abc" };auto res = sln.minDeletionSize(strs);Assert(res, 0);}}

2023年1月版

class Solution {
public:
int minDeletionSize(vector& strs) {
m_r = strs.size();
m_c = strs[0].length();
vector dp(m_c, 1);
for (int i = 0; i < m_c; i++)
{
for (int j = i + 1; j < m_c; j++)
{
bool bVilid = true;
for (int k = 0; k < m_r; k++)
{
if (strs[k][i] > strs[k][j])
{
bVilid = false;
}
}
if (bVilid)
{
dp[j] = max(dp[j], dp[i] + 1);
}
}
}
return m_c - *std::max_element(dp.begin(), dp.end());
}
int m_r;
int m_c;
};

2023年7月

class Solution {
public:
int minDeletionSize(vector& strs) {
m_r = strs.size();
m_c = strs[0].size();
//换过解法: 保留最多列 pre[i]表示以i结尾能保留多少列
vector pre;
for (int i = 0; i < m_c; i++)
{
int iMaxHas = 1;
for (int j = 0; j < pre.size(); j++)
{
bool bCan = true;
for (int r = 0; r < m_r; r++)
{
if (strs[r][i] < strs[r][j])
{
bCan = false;
}
}
if (bCan)
{
iMaxHas = max(iMaxHas, pre[j] + 1);
}
}
pre.emplace_back(iMaxHas);
}
return m_c - *std::max_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/651841.shtml

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

相关文章

群晖nas 中的 VideoStation 关于豆瓣刮刮和TheMovieDb无法链接问题

网上各种教学文档很多&#xff0c;但是都有各种的坑&#xff0c;这偏文章仅对坑进行修正&#xff0c;具体可以参考其他文章&#xff0c;不同点以此文章为准。 第一部分&#xff0c;豆瓣刮刮 是 VideoStation的最佳搭配&#xff0c;汉字匹配&#xff0c;速度肯定是TheMovieDb无…

贾玲新片刚刚发出紧急声明,是什么情况。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 1月22日&#xff0c;一则“多位明星参演的电影涉影视投资诈骗…

【Java 设计模式】行为型之访问者模式

文章目录 1. 定义2. 应用场景3. 代码实现结语 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为型设计模式&#xff0c;用于在不改变被访问元素的类的前提下定义对这些元素的新操作。访问者模式将数据结构与作用于结构上的操作解耦&#xff0c;使得操作集合可以灵…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、模仿学习、机器人、开放词汇

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 分类: 大语言模型LLM视觉模型VLM扩散模型视觉…

STM32 freertos 使用软件模拟串口uart

如题&#xff0c;为什么要这样做&#xff1f; 最近做的一个项目上使用了74HC595作为指示灯板使用&#xff1b; 这个灯板与驱动板是通过排线连接&#xff0c;排线约25cm长&#xff1b; 在实验室测试一切正常&#xff0c;发到客户手上使用就出现了某个LED跳动情况&#xff1b;…

假期刷题打卡--Day16

一、码题集正常刷题 1、MT1159 指定集合 某数组含有N个元素&#xff0c;输出那些数字来自集合{4,5,6}的元素&#xff0c;按原序。没有就输出-1。 格式 输入格式&#xff1a; 第一行输入数组长度N&#xff0c;第二行输入数组元素&#xff0c;整型&#xff0c;空格分隔。 输…

GitHub 一周热点汇总第7期(2024/01/21-01/27)

GitHub一周热点汇总第7期 (2024/01/21-01/27) &#xff0c;梳理每周热门的GitHub项目&#xff0c;离春节越来越近了&#xff0c;不知道大家都买好回家的票没有&#xff0c;希望大家都能顺利买到票&#xff0c;一起来看看这周的项目吧。 #1 rustdesk 项目名称&#xff1a;rust…

解决Linux部署报错No main manifest attribute, in XXX.jar

这是我近期遇到的一个问题&#xff0c;报错原因就是没找到主类&#xff0c;首先你在你本地运行&#xff0c;本地运行ok的话&#xff0c;解压生成的jar包&#xff0c;里面有个META-INF文件&#xff0c;打开MANIFEST.MF文件&#xff0c;该文件是一个清单文件。该文件包含有关JAR文…

vulnhub靶场之Five86-2

一.环境搭建 1.靶场描述 Five86-2 is another purposely built vulnerable lab with the intent of gaining experience in the world of penetration testing. The ultimate goal of this challenge is to get root and to read the one and only flag. Linux skills and fa…

凭证卷发放流程优化方案

背景 上周线上有多个大促活动&#xff0c;创建了多个凭证卷模版&#xff0c;并导入了大量劵码&#xff0c;其中有多个卷模版下的劵码超过50w, 在发放劵的时候&#xff0c;会先查询一次卷码库存&#xff0c;其中劵模版ID是分库分表键&#xff0c;所以在统一模版下的数据量过多了…

vusui css 使用,简单明了 适合后端人员 已解决

vusui-cssopen in new window 免除开发者繁复的手写 CSS 样式&#xff0c;让 WEB 前端开发更简单、灵活、便捷&#xff01;如果喜欢就点个 ★Staropen in new window 吧。 移动设备优先&#xff1a; vusui-css 包含了贯穿于整个库的移动设备优先的样式。浏览器支持&#xff1a…

三数之和----双指针

https://leetcode.cn/problems/3sum/description/?envType=study-plan-v2&envId=top-100-liked “三数之和”在某些人的口中被叫做“程序员之梦破碎的地方”。既然如此,这个题肯定是有难度的,尤其是其中的细节,很多,很细。 其中nums代表给定的数组,numsSize代表给定数…

GLog开源库使用

Glog地址&#xff1a;https://github.com/google/glog 官方文档&#xff1a;http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译&#xff0c;生成VS解决方案 &#xff08;1&#xff09;在glog-master文件夹内新建一个build文件夹&#xff0c;用…

C# 学习笔记-构造自己的类型

用 OOP 构建自己的类型 Building Your Own Types with Object-Oriented Programming 本章主题&#xff1a; 讨论 OOP构建类库在字段 field 中存储数据使用方法与元组 tuple使用属性和索引器控制访问使用 object 进行模式匹配&#xff08;Pattern matching&#xff09;使用 r…

【JAVA】什么是自旋

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在计算机科学的领域中&#xff0c;多线程和并发编程已成为处理复杂任务和提高系统性能的不可或缺的手段。…

【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建

系列文章目录 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part1 案例复现 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part2 自有数据集构建 【时间序列篇】基于LSTM的序列分类-Pytorch实现 part3 化为己用 在一个人体姿态估计的任务中&#xff0c;需要用深度学习模型…

深度学习(6)--Keras项目详解

目录 一.项目介绍 二.项目流程详解 2.1.导入所需要的工具包 2.2.输入参数 2.3.获取图像路径并遍历读取数据 2.4.数据集的切分和标签转换 2.5.网络模型构建 2.6.绘制结果曲线并将结果保存到本地 三.完整代码 四.首次运行结果 五.学习率对结果的影响 六.Dropout操作…

Compose | UI组件(三) | TextField() 输入框组件

文章目录 TextField() 简介TextField() 输入框例子TextField() 输入框添加装饰OutlinedTextField 边框样式输入框BasicTextField 输入框组件 总结 TextField() 简介 在 Compose 中&#xff0c;TextField() 组件表示文本输入框 ExperimentalMaterial3Api Composable fun TextF…

一个基于electron自动化桌面应用-流程图构建

前期工作已搞定&#xff0c;现在可以搭建桌面应用了。这个阶段可以结合前面定义好的数据格式构建流程图。 模板 还是使用熟悉的技术栈vite react electron&#xff0c;模板 流程图 官方文档 自定义 节点样式 因为配置化的操作类型较多&#xff0c;因此可以利用自定义节…

【开源】基于JAVA语言的就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…