动态规划 Leetcode 516 最长回文子序列

最长回文子序列

Leetcode 516

学习记录自代码随想录

要点:1.dp数组定义为:dp[i][j]为区间是s[i:j]内最长回文子序列;

2.递推公式: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])

3.dp数组初始化dp[i][i] = 1, 其余为0

4.遍历顺序:for(int i = n-2; i >= 0; i--)

for(int j = i+1; j < n; j++)

cpp 复制代码
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n = s.size();
        // 1.dp[i][j] 区间s[i:j]内最长的回文子序列长度
        vector<vector<int>> dp(n, vector<int>(n, 0));
        // 2.递推公式: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])
        // 3.初始化:dp[i][i] = 1;
        for(int i = 0; i < n; i++) dp[i][i] = 1;
        // 4.遍历顺序:i+1->i, j-1->j
        for(int i = n-2; 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]);
            }
        }
        // 5.举例推导dp数组
        return dp[0][n-1];
    }
};
相关推荐
SophiaSSSSS1 小时前
无标注文本的行业划分(行业分类)算法 —— 无监督或自监督学习
学习·算法·分类
明月清了个风2 小时前
数据结构与算法学习笔记(Acwing提高课)----动态规划·数字三角形
笔记·学习·算法·动态规划
刃神太酷啦2 小时前
堆和二叉树--数据结构初阶(3)(C/C++)
c语言·数据结构·c++·算法·leetcode·深度优先·宽度优先
●VON2 小时前
杭电oj(1087、1203、1003)题解
算法·leetcode·职场和发展
良木林2 小时前
240424 leetcode exercises II
c语言·数据结构·算法·leetcode
啊阿狸不会拉杆3 小时前
数据结构-排序
java·c语言·数据结构·c++·python·算法·排序算法
姜行运3 小时前
数据结构【树和二叉树】
android·数据结构·算法·c#
敢敢のwings3 小时前
相机雷达外参标定算法调研
数码相机·算法
User_芊芊君子3 小时前
【C语言经典算法实战】:从“移动距离”问题看矩阵坐标计算
c语言·算法·矩阵
wolf犭良4 小时前
37、aiomysql实操习题
开发语言·python·算法