动态规划 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];
    }
};
相关推荐
TL滕23 分钟前
从0开始学算法——第四天(练点题吧)
数据结构·笔记·学习·算法
[J] 一坚25 分钟前
华为OD、微软、Google、神州数码、腾讯、中兴、网易有道C/C++字符串、数组、链表、树等笔试真题精粹
c语言·数据结构·c++·算法·链表
多则惑少则明28 分钟前
【算法题4】找出字符串中的最长回文子串(Java版)
java·开发语言·数据结构·算法
迷途之人不知返32 分钟前
二叉树题目
数据结构·算法
优宁维生物1 小时前
DNA 提取的基础方法
人工智能·算法
@Aurora.2 小时前
优选算法【专题二:滑动窗口】
算法
小石头 100862 小时前
【Java】String类(超级详细!!!)
java·开发语言·算法
.柒宇.2 小时前
力扣hot100---42.接雨水(java版)
java·算法·leetcode
youngee112 小时前
hot100-41验证二叉搜索树
算法
迈巴赫车主2 小时前
蓝桥杯20534爆破 java
java·数据结构·算法·职场和发展·蓝桥杯