【LeetCode】:删除回文子数组【困难】

ops/2025/1/12 19:27:49/

在这里插入图片描述
在这里插入图片描述

class Solution {
public:// 思考:能否用滚动数组进行优化int minimumMoves(vector<int>& arr) {// 定义状态dp[i][j]为i-j的最小步数int n = arr.size();vector<vector<int>> dp(n, vector<int>(n, 1e9 + 7));// 可以把这 1 次理解为一种 最小操作单位 或者// 基准操作次数后续计算更长的子数组的最小移动次数时// 都是基于这个基准进行递推和比较的 如果将单个元素的情况定义为 0 次// 那么在后续的状态转移计算中// 可能会出现逻辑上的不顺畅或者需要额外的特殊处理来区分这种情况// 反而会使算法变得复杂和难以理解for (int i = 0; i < n; ++i) {dp[i][i] = 1;}for (int i = 0; i + 1 < n; ++i) {if (arr[i] == arr[i + 1]) {dp[i][i + 1] = 1;} else {dp[i][i + 1] = 2;}}// 前面解决的是长度为2的子数组;// 现在解决的是长度为3及其以上的子数组的最小移动次数;for (int step = 3; step <= n; ++step) {// i+step-1表示索引的位置是从0位置到2及其以上的位置;for (int i = 0; i + step - 1 < n; ++i) {int j = i + step - 1;for (int k = i; k < j; ++k) {dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j]);}if (arr[i] == arr[j]) {// 如果arr[i] == arr[j] 则dp[i][j] = min(dp[i][j] dp[i +// 1][j - 1]) 这是因为当子数组的首尾元素相同时// 可以考虑将首尾元素之外的子数组[i + 1, j -// 1]变为相同元素,然后首尾元素自然就相同了// 取这种情况下的最小移动次数与当前dp[i][j]的值比较// 取较小值更新dp[i][j]dp[i][j] = min(dp[i][j], dp[i + 1][j - 1]);}}}return dp[0][n - 1];}
};// 以下是这段代码中状态表示这样定义的原因:
// 一、全面覆盖问题的子问题空间
// 定义 dp[i][j] 表示将数组 arr 中从索引 i 到索引 j
// 的子数组变为相同元素所需的最小移动次数,这种二维的状态表示能够涵盖数组的所有子数组情况。
// 从单个元素的子数组(i = j)到整个数组(i = 0,j = n - 1,其中 n
// 是数组长度),通过这种方式可以系统地考虑和处理每一种可能的子数组组合,确保不会遗漏任何一种情况,为求解整个问题提供了全面的基础。
// 二、便于状态转移和递推计算
// 在计算 dp[i][j]
// 的过程中,需要基于更短的子数组的状态来推导。例如,通过枚举分割点 k(i <= k <
// j),将 [i, j] 子数组分为 [i, k] 和 [k + 1, j] 两部分,此时 dp[i][k] 和 dp[k
// + 1][j] 就是已经计算过的更短子数组的状态。
// 这种二维状态表示使得在进行状态转移时,可以很方便地根据子数组的分割关系来建立状态之间的联系,通过取
// dp[i][k] + dp[k + 1][j] 的最小值等方式来更新
// dp[i][j],符合动态规划中通过子问题的最优解来构建更大问题最优解的思想。
// 三、与问题的求解目标紧密相关
// 最终问题是求将整个数组变为相同元素的最小移动次数,而 dp[0][n - 1]
// 正好对应了这个最终目标。通过逐步计算从单个元素到整个数组的所有子数组的状态,最终能够得到
// dp[0][n - 1] 的值,即整个问题的解。
// 这种状态表示方式直接针对问题的核心需求,将问题的求解过程转化为对一系列子数组状态的计算和更新,使得算法的设计和实现能够紧密围绕问题的本质,提高算法的针对性和有效性。// bool isPalindrome(const std::vector<int>& arr, int start, int end) {
//     while (start < end) {
//         if (arr[start] != arr[end]) {
//             return false;
//         }
//         start++;
//         end--;
//     }
//     return true;
// }// int minimumMoves(std::vector<int>& arr) {
//     int n = arr.size();
//     std::vector<int> dp(n, n);
//     dp[0] = 1;
//     for (int i = 1; i < n; ++i) {
//         dp[i] = dp[i - 1] + 1;
//         for (int j = 0; j < i; ++j) {
//             if (isPalindrome(arr, j, i)) {
//                 dp[i] = std::min(dp[i], (j > 0 ? dp[j - 1] : 0) + 1);
//             }
//         }
//     }
//     return dp[n - 1];

http://www.ppmy.cn/ops/149533.html

相关文章

android ROM开发网络下载速度缓慢问题解决方案

由于近期公司项目不断有客户反馈文件下载速度太慢&#xff0c;之前一直以为是客户网络环境原因就没有太在意&#xff0c;直到有反馈说有线网络下载比wifi网络下载要慢很多&#xff0c;网络环境带宽网速等都没问题。详细对比测试后发现的确如此&#xff0c;wifi环境下载能达到10…

pdf提取文本,表格以及转图片:spire.pdf

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380; 1. pdfbox1.1导入pdfbox 的maven依赖1.1 提取文本1.2 提取文本表格&#xff08;可自行加入逻辑处理&#xff09;1.3 pdf转换成图片代码&…

linux下的MongoDB手动安装部署详解

MongoDB数据库很常用.但是有时候难免需要手动部署。这里分享下教程笔记&#xff0c;分享给有需要的小伙伴&#xff0c;需要的可以收藏。 要解压和安装 MongoDB&#xff0c;您可以按照以下步骤操作&#xff1a; 下载&#xff1a; https://www.mongodb.com/try/download/commun…

昆虫分割数据集labelme格式9484张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;9484 标注数量(json文件个数)&#xff1a;9484 标注类别数&#xff1a;1 标注类别名称:["insect"] 每个类别标注的框数&…

论文阅读:LDA-AQU:Adaptive Query-guided Upsampling via Local Deformable Attention

论文地址&#xff1a;arxiv 摘要 提出了一种上采样的模块&#xff0c;有着较好的效果。 正文 常见的上采样方法有最近邻插值和双线性插值&#xff0c;通过手动的范式从邻近点聚合特征。之后又提出了可学习的上采样方法&#xff0c;比如反卷积&#xff0c;像素洗牌等。但是这…

Keil C51 与 Keil MDK(ARM-stm32?):嵌入式开发的利器

Keil C51 与 Keil MDK&#xff08;ARM&#xff09;&#xff1a;嵌入式开发的利器 引言 在嵌入式系统开发领域&#xff0c;Keil 软件套件是广受开发者欢迎的工具之一。Keil 提供了多种开发环境&#xff0c;其中最著名的两个是 Keil C51 和 Keil MDK&#xff08;Microcontrolle…

arcgis中用python脚本批量给多个要素类的相同字段赋值

1、python脚本 import arcpy# 设置工作空间路径 arcpy.env.workspace = r"D:\test.gdb"# 要素集名称 feature_dataset = "test"# 线要素类名称列表,初始化为空 line_feature_classes = []# 遍历要素集获取所有线要素类 for fc in arcpy.ListFeatureClass…

【C语言学习】——命令行编译运行 C 语言程序的完整流程,理解C语言编译的底层实现和编译原理相关知识

今天要学习的内容是 命令行编译运行 C 语言程序&#xff0c;更好的学习理解C语言编译运行的底层实现和编译原理相关知识&#xff0c;下面介绍命令行编译运行 C 语言程序的完整流程 一、理论讲解 1. 编译原理概述 1.1 编译过程的四个主要阶段 源代码 (.c) → 预处理 → 编译 …