动态规划 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];
    }
};
相关推荐
课堂剪切板2 小时前
ch03 部分题目思路
算法
山登绝顶我为峰 3(^v^)33 小时前
如何录制带备注的演示文稿(LaTex Beamer + Pympress)
c++·线性代数·算法·计算机·密码学·音视频·latex
Two_brushes.4 小时前
【算法】宽度优先遍历BFS
算法·leetcode·哈希算法·宽度优先
森焱森6 小时前
水下航行器外形分类详解
c语言·单片机·算法·架构·无人机
QuantumStack8 小时前
【C++ 真题】P1104 生日
开发语言·c++·算法
写个博客8 小时前
暑假算法日记第一天
算法
绿皮的猪猪侠8 小时前
算法笔记上机训练实战指南刷题
笔记·算法·pta·上机·浙大
hie988949 小时前
MATLAB锂离子电池伪二维(P2D)模型实现
人工智能·算法·matlab
杰克尼9 小时前
BM5 合并k个已排序的链表
数据结构·算法·链表
.30-06Springfield10 小时前
决策树(Decision tree)算法详解(ID3、C4.5、CART)
人工智能·python·算法·决策树·机器学习