AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

dp最长回文子序列

作者: 作者的头像   Dessa ,  2024-11-02 12:35:46 ,  所有人可见 ,  阅读 26


0


https://leetcode.cn/problems/longest-palindromic-subsequence/submissions/577570212/

性质1:对于字符a,把a反过来赋值给b,求a的最长回文子序列就是求a和b的最长公共子序列

设dp[l][r]代表l到r的最长回文子序列

情况1:l和r都不取,dp[l][r]=max(dp[l][r],dp[l+1][[r-1])

情况2:l+1,r

情况3:l,r-1

情况4:s[l]和s[r]相等,必定是dp[l+1][-1]+2最优

画出dp表:

l和r相等时,dp[l][r]=1,l+1==r时,如果s[l]==s[r],dp[l][r]=2,否则为1,就以此为基础展开dp表,答案就是dp[0][n-1]

const int N=1010;
int dp[N][N];
class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int n=s.length();
        for(int i=0;i<=n;i++)
            for(int j=0;j<=n;j++)
                dp[i][j]=0;
        for(int i=0;i<n;i++) dp[i][i]=1;
        for(int l=n-1;l>=0;l--)
        {
            for(int r=l+1;r<n;r++)
            {
                if(l+1==r)
                {
                    if(s[l]==s[r]) dp[l][r]=2;
                    else dp[l][r]=1;
                }
                else
                {
                    if(s[l]==s[r]) dp[l][r]=max(dp[l][r],dp[l+1][r-1]+2);
                    else dp[l][r]=max(dp[l+1][r],dp[l][r-1]);
                }
            }
        }
        return dp[0][n-1];
    }
};

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息