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

news2025/1/12 17:18:30

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

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.coloradmin.cn/o/2275575.html

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

相关文章

如何理解机器学习中的线性模型 ?

在机器学习中&#xff0c;线性模型是一类重要且基础的模型&#xff0c;它假设目标变量&#xff08;输出&#xff09;是输入变量&#xff08;特征&#xff09;的线性组合。线性模型的核心思想是通过优化模型的参数&#xff0c;使模型能够捕捉输入与输出之间的线性关系。以下是线…

golang常用标准库

输入与输出-fmt包时间与日期-time包命令行参数解析-flag包日志-log包IO操作-os包IO操作-bufio包与ioutil包strconv包模板-template包http包contextjson/xmlreflect反射官方标准库 输入与输出-fmt包 输入与输出 常用输出函数 Print、Printf、Println&#xff1a;直接输出内容 Sp…

STM32 I2C硬件配置库函数

单片机学习&#xff01; 目录 前言 一、I2C_DeInit函数 二、I2C_Init函数 三、I2C_StructInit函数 四、I2C_Cmd函数 五、I2C_GenerateSTART函数 六、I2C_GenerateSTOP函数 七、I2C_AcknowledgeConfig函数 八、I2C_SendData函数 九、I2C_ReceiveData函数 十、I2C_Sen…

sys.dm_exec_connections:查询与 SQL Server 实例建立的连接有关的信息以及每个连接的详细信息(客户端ip)

文章目录 引言I 基于dm_exec_connections查询客户端ip权限物理联接时间范围dm_exec_connections表see also: 监视SQL Server 内存使用量资源信号灯 DMV sys.dm_exec_query_resource_semaphores( 确定查询执行内存的等待)引言 查询历史数据库客户端ip应用场景: 安全分析缺乏…

plane开源的自托管项目

Plane 是一个开源的自托管项目规划解决方案&#xff0c;专注于问题管理、里程碑跟踪以及产品路线图的设计。作为一款开源软件&#xff0c;Plane 的代码托管在 GitHub 平台上&#xff0c;允许任何人查看和贡献代码。它为用户提供了便捷的项目创建与管理手段&#xff0c;并配备了…

高光谱相机的特点

光谱特性 高光谱分辨率&#xff1a;能将光谱范围分割成极窄的波段&#xff0c;光谱分辨率通常达到纳米级甚至亚纳米级&#xff0c;可精确捕捉到不同物质在细微光谱差异上的特征&#xff0c;比如可以区分不同种类的植被因叶绿素含量等差异而在光谱上的细微变化。 多波段探测&a…

1.两数之和--力扣

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案&#xff0c;并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…

yolov5+colab跑起来

教程1.先上传网盘再run 教程2.直接上传解压run 本人过程

el-tree拖拽光标错位问题

背景&#xff1a;el-tree实现的分类树增加拖拽功能后&#xff0c;当分类树由于数量较多产生滚动条&#xff0c;如果分类树已滚动&#xff0c;进行拖拽时会造成光标错位的问题: 原因&#xff1a;el-tree拖拽光标定位的高度并未加上滚动的高度解决&#xff1a;将滚动的样式属性放…

Copula算法原理和R语言股市收益率相依性可视化分析

阅读全文&#xff1a;http://tecdat.cn/?p6193 copula是将多变量分布函数与其边缘分布函数耦合的函数&#xff0c;通常称为边缘。在本视频中&#xff0c;我们通过可视化的方式直观地介绍了Copula函数&#xff0c;并通过R软件应用于金融时间序列数据来理解它&#xff08;点击文…

OpenCV计算机视觉 07 图像的模块匹配

在做目标检测、图像识别时&#xff0c;我们经常用到模板匹配&#xff0c;以确定模板在输入图像中的可能位置 API函数 cv2.matchTemplate(image, templ, method, resultNone, maskNone) 参数含义&#xff1a; image&#xff1a;待搜索图像 templ&#xff1a;模板图像 method&…

相加交互效应函数发布—适用于逻辑回归、cox回归、glmm模型、gee模型

在统计分析中交互作用是指某因素的作用随其他因素水平变化而变化&#xff0c;两因素共同作用不等于两因素单独作用之和(相加交互作用)或之积(相乘交互作用)。相互作用的评估是尺度相关的&#xff1a;乘法或加法。乘法尺度上的相互作用意味着两次暴露的综合效应大于&#xff08;…

深入解析 Flink 与 Spark 的性能差异

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

工厂人员定位管理系统方案(二)人员精确定位系统架构设计,适用于工厂智能管理

哈喽~这里是维小帮&#xff0c;提供多个场所的定位管理方案&#xff0c;如需获取工厂人员定位管理系统解决方案可前往文章最下方获取&#xff0c;如有项目合作及技术交流欢迎私信我们哦~撒花 在上一篇文章中&#xff0c;我们初步探讨了工厂人员定位管理系统的需求背景以及定位方…

Wi-Fi Direct (P2P)原理及功能介绍

目录 Wi-Fi Direct &#xff08;P2P&#xff09;介绍Wi-Fi Direct P2P 概述P2P-GO&#xff08;P2P Group Owner&#xff09;工作流程 wifi-Direct使用windows11 wifi-directOpenwrtwifi的concurrent mode Linux环境下的配置工具必联wifi芯片P2P支持REF Wi-Fi Direct &#xff…

Linux第二课:LinuxC高级 学习记录day01

0、大纲 0.1、Linux 软件安装&#xff0c;用户管理&#xff0c;进程管理&#xff0c;shell 命令&#xff0c;硬链接和软连接&#xff0c;解压和压缩&#xff0c;功能性语句&#xff0c;结构性语句&#xff0c;分文件&#xff0c;make工具&#xff0c;shell脚本 0.2、C高级 …

L4-Prompt-Delta

Paper List PromptPapers:https://github.com/thunlp/PromptPapersDeltaPapers: https://github.com/thunlp/DeltaPapers Programming Toolkit OpemPrompt: https://github.com/thunlp/OpenPromptOpenDelta: https://github.com/thunlp/OpenDelta 一、传统微调方法&#xff1…

关于husky8.0 与 4.0的配置

husky的场景使用很多&#xff0c;一般大多场景是在配置git commit 命令拦截hook, 校验 commit-msg 格式规范。以下环境默认&#xff1a;git > 2.27.0, node >14 1、安装huskey8.0.1 npm install --save-dev husky8.0.1 2、初始化配置文件 在package.json scripts 属性…

ML汇总

Introduction and Overview 机器学习算法模型压缩Feature scaling 特征缩放损失函数正则化优化方式激活函数机器学习算法 逻辑回归: 用于二分类问题。它基于一个或多个预测变量建模二元结果的概率。 线性回归: 用于预测基于一个或多个预测变量的连续结果。它通过拟合线性方程来…

Day04-后端Web基础(Maven基础)

目录 Maven课程内容1. Maven初识1.1 什么是Maven?1.2 Maven的作用1.2.1 依赖管理1.2.2 项目构建1.2.3 统一项目结构 2. Maven概述2.1 Maven介绍2.2 Maven模型2.3 Maven仓库2.4 Maven安装2.4.1 下载2.4.2 安装步骤 3. IDEA集成Maven3.1 配置Maven环境3.1.2 全局设置 3.2 Maven项…