【编程题-错题集】最长回文子序列(动态规划 - 区间dp)

简介: 【编程题-错题集】最长回文子序列(动态规划 - 区间dp)

牛客对应题目链接:最长回文子序列_牛客题霸_牛客网 (nowcoder.com)


一、分析题目

基础的区间 dp 问题:

1、状态表示

dp[i][j] 表示:字符串 [i, j] 区间内的最长回文子序列的长度。


2、状态转移方程

  1. 当 i > j,dp[i][j] = 0(不讨论这种情况,可以保证不存在这种情况)
  2. i == j 的时候,只有⼀个字符,长度为 1,即 dp[i][j] = 1;
  3. i < j 的时候,分情况讨论:
  • 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])

3、初始化

根据状态转移方程,可以知道 dp[i][j] 的取值方向只会从它的左边、左下、下面三个方向去取,而这些方向除了 i==j 时是初始化为 1 的以外,其它的都是 i > j,不需要另外进行初始化。


4、填表顺序

从下往上,从左往右。


5、返回值

dp[0][n-1](可以返回状态表示的含义去思考返回值)


二、代码

1、力扣AC代码

//动态规划-二维dp
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n=s.size();
        vector<vector<int>> dp(n, vector<int>(n));
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                if(i==j) dp[i][j]=1;
        for(int i=n-1; i>=0; i--)
        {
            for(int j=i+1; j<n; j++)
            {
                if(s[i]==s[j])
                    dp[i][j]=dp[i+1][j-1]+2;
                else
                    dp[i][j]=max(dp[i+1][j], dp[i][j-1]);
            }
        }
        return dp[0][n-1];
    }
};
 
//动态规划-二维dp-优化
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n=s.size();
        vector<vector<int>> dp(n, vector<int>(n));
        for(int i=0; i<n; i++)
            dp[i][i]=1;
        for(int i=n-1; i>=0; i--)
        {
            for(int j=i+1; j<n; j++)
            {
                if(s[i]==s[j])
                    dp[i][j]=dp[i+1][j-1]+2;
                else
                    dp[i][j]=max(dp[i+1][j], dp[i][j-1]);
            }
        }
        return dp[0][n-1];
    }
};

2、值得学习的代码

#include <iostream>
#include <string>
 
using namespace std;
 
int dp[1010][1010];
 
int main()
{
    string s;
    cin >> s;
    int n = s.size();
 
    for(int i = n - 1; i >= 0; i--)
    {
        dp[i][i] = 1;
        for(int j = i + 1; j < n; j++)
        {
            if(s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2;
            else dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
        }
    }
 
 cout << dp[0][n - 1] << endl;
 
 return 0;
}

三、反思与改进

做这道题时,我还是想到了之前写过的5. 最长回文子串 - 力扣(LeetCode),然后就还是按着之前的分类讨论的思路去写了,结果只能通过一般的测试样例。忽略了这两道题目的不同之处:之前写的题目要求的是子串,说明是连续序列;而这道题目要求的是子序列,并没有要求是连续的,所以这两道题目的解法肯定不一样。

本题应该是与516. 最长回文子序列 - 力扣(LeetCode)要求一致,不过这道题之前也写过,印象不深刻,说明没有掌握这类题目的本质,不熟练就多做几次吧。


相关文章
|
7月前
|
敏捷开发 人工智能 数据可视化
2025年必备的任务跟踪管理工具深度解析:10款提升团队协作效率的专业平台
任务跟踪管理工具在企业运营中日益重要,尤其在2025年,AI驱动、实时协作、跨平台同步及系统集成成为主要趋势。本文介绍了10款必备工具,如PingCode、Worktile、Trello、Jira等,并分析了其适用场景与功能特点,帮助企业根据团队规模、工作方法论和集成需求选择合适工具,提升协作效率与项目管理水平。
385 3
|
机器学习/深度学习 编解码 自然语言处理
【文献学习】An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
本文介绍了如何使用纯Transformer模型进行图像识别,并讨论了模型的结构、训练策略及其在多个图像识别基准上的性能。
902 3
|
算法 Java
数学建模常用算法:蚁群算法求解tsp问题+att48算例测试【java实现--详细注释】
数学建模常用算法:蚁群算法求解tsp问题+att48算例测试【java实现--详细注释】
307 0
|
网络协议 Windows
glusterfs 客户端访问
访问glusterfs- 配置GlusterFS 客户端 访问glusterfs卷有多种方式. 1.使用Gluster Native Client 模式:这种方式提供了高并发,高性能,传输失败恢复机制,但只适用于GNU/Linux.
2367 0
|
XML Android开发 数据格式
Android学习之Animation(三)
今天观看了一个关于android动画的一些知识,就顺便记录下来,以备之后的学习和参考。 在XML文件中使用LayoutAnimationController 第一步: 在res/anim文件夹下创建一个xml文件,如list_layout_animation.xml.代码的内容如下面的简单的示例: 其中animation属性对应的值就是添加的动画资源文件。
1143 0
|
10天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
6天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
3944 11
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
7天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
4545 14
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
9天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
7082 15
|
5天前
|
人工智能 机器人 Linux
OpenClaw(Clawdbot、Moltbot)汉化版部署教程指南(零门槛)
OpenClaw作为2026年GitHub上增长最快的开源项目之一,一周内Stars从7800飙升至12万+,其核心优势在于打破传统聊天机器人的局限,能真正执行读写文件、运行脚本、浏览器自动化等实操任务。但原版全英文界面对中文用户存在上手门槛,汉化版通过覆盖命令行(CLI)与网页控制台(Dashboard)核心模块,解决了语言障碍,同时保持与官方版本的实时同步,确保新功能最快1小时内可用。本文将详细拆解汉化版OpenClaw的搭建流程,涵盖本地安装、Docker部署、服务器远程访问等场景,同时提供环境适配、问题排查与国内应用集成方案,助力中文用户高效搭建专属AI助手。
2730 6