区间动态规划——最长回文子序列长度(C++)

news2025/2/27 5:37:08

把夜熬成粥,然后喝了它。

——2024年7月1日


书接上回:区间动态规划——最长回文子串(C++)-CSDN博客,大家有想到解决办法吗?

题目描述

        给定一个字符串s(s仅由数字和英文大小写字母组成,长度为1~1000),求s中最长的回文子序列长度。例如,s = “aferegga”,最长的回文子序列为“aerea”,其长度为5。


题解思路

        区间动态规划

下面是个人的思路:

1. 定义dp数组

        定义 dp[i][j]表示 s[i...j] 中最长回文子序列长度。

2. 确定dp限制条件

注:len表示字符串长度

        ①对于任何 len == 1 的字符串,dp[i][j] = 1;

        ②对于任何 len == 2 的字符串,dp[i][j] = dp[i][j-1] + (s[i] == s[j]);

        ③对于任何 len  ≥  3 的字符串,有两种情况:

        如果 s[i] == s[j],那么dp[i][j] = dp[i+1][j-1] + 2

        如果 s[i] != s[j],那么dp[i][j] = max(dp[i+1][j],dp[i][j-1])

解释如下:

        第一种情况,如果字符串长度为1的话,那么它一定是回文子串,长度唯一;

        第二种情况,如果字符串长度为2,那它就有两种可能,要么这两个字符相等,要么不等,不管哪一种情况,这个字符串的回文子序列至少是大于等于1的(第一种情况),如果相等,无非是把这个相等的加上即可。

        第三种情况,字符串长度不小于3时,也有两种可能:
        如果 s[i] == s[j],那么当前最长回文子序列长度就等于上一次的回文子序列长度加上2(两个相同的字符),也可以表示为dp[i][j] = dp[i+1][j-1] + 2*(s[i] == s[j])
        如果 s[i] != s[j],那么当前最长回文子序列长度至少是在 s[i+1....j]和s[i....j-1]中取最大值,即dp[i][j] = max(dp[i+1][j],dp[i][j-1])


推导过程

用矩阵推导如下:

 

代码展示

// 最长回文子序列长度
int getLongestPalind(string s){
    int size = s.size();
    vector<vector<int>> dp(size, vector<int> (size, 0));
    // 定义dp数组
    // dp[i][j]表示从i到j的最长子回文字符串长度
    for(int len = 1; len <= size; len++){
        for(int i = 0; i + len - 1 < size; i++){
            int j = i + len - 1;
            if(len == 1){
                dp[i][j] = 1;
            }
            else if(len == 2){
                dp[i][j] = dp[i][j-1] + (s[i] == s[j]);
            }
            else{
                if(s[i] == s[j]){
                    dp[i][j] = dp[i+1][j-1] + 2 * (s[i] == s[j]);
                }
                else{
                    dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
    }
    return dp[0][size-1];
}

运行结果

完整代码

// 区间动态规划
#include<iostream>
#include<vector>
#include<string>

using namespace std;

// 最长回文子序列长度
int getLongestPalind(string s){
    int size = s.size();
    vector<vector<int>> dp(size, vector<int> (size, 0));
    // 定义dp数组
    // dp[i][j]表示从i到j的最长子回文字符串长度
    for(int len = 1; len <= size; len++){
        for(int i = 0; i + len - 1 < size; i++){
            int j = i + len - 1;
            if(len == 1){
                dp[i][j] = 1;
            }
            else if(len == 2){
                dp[i][j] = dp[i][j-1] + (s[i] == s[j]);
            }
            else{
                if(s[i] == s[j]){
                    dp[i][j] = dp[i+1][j-1] + 2 * (s[i] == s[j]);
                }
                else{
                    dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
    }
    return dp[0][size-1];
}


int main(){
    string s;
    cout<<"请输入字符串s:";
    cin>>s;
    cout<<"最长回文子序列长度为"<<getLongestPalind(s)<<endl;
    return 0;
}

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

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

相关文章

JavaSEJava8 时间日期API + 使用心得

文章目录 1. LocalDate2. LocalTime3. LocalDateTime3.1创建 LocalDateTime3.2 LocalDateTime获取方法 4. LocalDateTime转换方法4.1 LocalDateTime增加或者减少时间的方法4.2 LocalDateTime修改方法 5. Period6. Duration7. 格式转换7.1 时间日期转换为字符串7.2 字符串转换为…

基于YOLOv5的人脸目标检测

本文是在之前的基于yolov5的人脸关键点检测项目上扩展来的。因为人脸目标检测的效果将直接影响到人脸关键点检测的效果&#xff0c;因此本文主要讲解利用yolov5训练人脸目标检测(关键点检测可以看我人脸关键点检测文章) 基于yolov5的人脸关键点检测&#xff1a;人脸关键点检测…

FL Studio 21.0.3.3517中文破解版2024最新Keygen免费下载安装激活教程

你们是否也是音乐制作爱好者呢&#xff1f;如果是&#xff0c;那就仔细阅读文章收集对自己有帮助的操作技巧吧~~ FL Studio 21.2.3 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 FL Studio 21 .2.3Mac-安装包下载如下: https://wm.makeding.com/iclk/?…

Unity 3D软件下载安装;Unity 3D游戏制作软件资源包获取!

Unity3D&#xff0c;它凭借强大的功能和灵活的特性&#xff0c;在游戏开发和互动内容创作领域发挥着举足轻重的作用。 作为一款顶尖的游戏引擎&#xff0c;Unity3D内置了先进的物理引擎——PhysX。这一物理引擎堪称业界翘楚&#xff0c;能够为开发者提供全方位、高精度的物理模…

东软医疗获通用技术集团战略投资,共创中国医疗设备产业未来

近日&#xff0c;通用技术集团所属资本公司联合中国国有企业混合所有制改革基金有限公司与东软医疗系统股份有限公司&#xff08;下称“东软医疗”&#xff09;签署投资协议&#xff0c;战略投资东软医疗。 作为央企和民企携手发展高端医疗设备产业的具体实践&#xff0c;此次…

有什么事在windows上显的顺理成章,在Linux上就很令人费解?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;可以假定一个几乎恒久不变的…

基于Java的音乐网站系统01239

目 录 摘要 1 绪论 1.1 研究背景 1.2系统开发目标、意义 1.3研究内容 2 相关技术介绍 2.1 MySQL数据库 2.2 Java编程语言 2.3 SpringBoot框架介绍 3 系统需求分析与设计 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济可行性分析 3.1.3 法律可行性分析 3.2 需…

已成功与服务器建立连接,但是在登录过程中发生错误。(provider: SSL提供程序,error:0-证书链是由不受信任的颁发机构颁发的。)

已成功与服务器建立连接&#xff0c;但是在登录过程中发生错误。(provider: SSL提供程序,error:0-证书链是由不受信任的颁发机构颁发的。) 在连接SQL Server2008R2数据库时发生错误。 连接字符串&#xff1a;server127.0.0.1;uidsa;pwd1;databasedb; 解决办法&#xff1a; 方…

Python--线程基础

相关概念 线程是"轻量级进程",是计算机中CPU进行任务调度的最小单位。 线程属于进程的一部分,一个线程只能属于一个进程,而一个进程可以有多个线程,且至少有一个线程。 每个进程开始的创建的时候,都会随之创建一个主线程。 进程负责分配和隔离资源(CPU, 内存…

2002-2022年各省老年人口抚养比(人口抽样调查)数据

2002-2022年各省老年人口抚养比(人口抽样调查)数据 1、时间&#xff1a;2002-2022年 2、指标&#xff1a;老年人口抚养比 3、来源&#xff1a;国家统计局、统计年鉴 4、范围&#xff1a;31省&#xff0c; 5、缺失情况&#xff1a;无缺失&#xff0c;其中2010年的值取2009、…

人脸嵌入向量提取计算

本文将讨论如何使用开源中提供的预训练模型从图像中提取人脸编码或人脸嵌入。我还附上了代码&#xff0c;请参阅此 git仓库。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出…

灌区量测水管理系统是如何实现灌区节水?

随着全球水资源日益紧张&#xff0c;节水已成为农业生产中不可忽视的一环。在灌区管理中&#xff0c;量测水管理系统以其精准的数据监测和科学的灌溉管理&#xff0c;为实现灌区节水提供了强有力的技术支持。 灌区量测水管理系统是一套集成了自动化监测、数据传输、数据分析和…

基于星火大模型的群聊对话分角色要素提取挑战赛|#AI夏令营#Datawhale#夏令营-Lora微调与prompt构造

赛题连接 https://challenge.xfyun.cn/topic/info?typerole-element-extraction&optionphb Datawhale Al夏令营 零基础入门大模型技术竞赛 数据集预处理 由于赛题官方限定使用了星火大模型&#xff0c;所以只能调用星火大模型的API或者使用零代码微调 首先训练数据很少…

fyne一个复杂的布局案例

一个复杂的布局案例 实现如下布局: 布局分析: 代码如下: package mainimport ("complexlayout/icons""fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/canvas""fyne.io/fyne/v2/container""fyne.io/fyne/v2…

昇思MindSpore学习入门-保存与加载

在训练网络模型的过程中&#xff0c;实际上我们希望保存中间和最后的结果&#xff0c;用于微调&#xff08;fine-tune&#xff09;和后续的模型推理与部署&#xff0c;本章节我们将介绍如何保存与加载模型。 保存和加载模型权重 保存模型使用save_checkpoint接口&#xff0c;…

在Linux上运行macOS:深度解析OSX-KVM项目

在Linux上运行macOS&#xff1a;深度解析OSX-KVM项目 在现代开发和测试环境中&#xff0c;能够在不同操作系统之间无缝切换是至关重要的。对于开发者而言&#xff0c;如何在Linux系统上运行macOS一直是一个挑战。然而&#xff0c;OSX-KVM项目为我们提供了一种高效的解决方案&a…

rtpengine 项目

目录 &#xff01;1. 如果容器内部修改 rtpengine 并且让他生效 守护进程模块(daemon) 内核模块(kernel-module) 录音守护进程模块(recording-daemon) iptables扩展模块(iptables-extension) 2. 在Docker容器中编译好四个模块后&#xff0c;您需要采取以下步骤 1. 加载内…

网易云商发布《2024体验增长白皮书》,助力企业找到增长突破点

“过去几年里&#xff0c;当我们做内部审视和自我反思时&#xff0c;我们知道阿里落后了&#xff0c;因为我们忘记了真正的客户是谁。我们的客户是使用APP进行购物的人&#xff0c;而我们没有给他们最好的体验。” 4月3日&#xff0c;在挪威主权财富基金&#xff08;Norges Ba…

以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!

大家好,我是CodeQi! 项目开发中,Loading 的展示与关闭是非常关键的用户体验设计。 当我们的应用需要发起多个异步请求时,如何有效地管理全局 Loading 状态,保证用户在等待数据加载时能有明确的反馈,这是一个值得深入探讨的问题。 本文将以 Vue 3 项目为例,详细讲解如…

Mac视频下载工具,兼容14系统,Downie 4软件下载

Downie 4 是一款由James Application开发的视频下载软件&#xff0c;支持Mac操作系统。该软件允许用户从各种视频网站上下载视频内容&#xff0c;以便于在本地设备上观看&#xff0c;无需依赖互联网连接。自动下载&#xff1a;可以设置Downie 4自动下载指定网站上的视频&#x…