力扣3472. 至多 K 次操作后的最长回文子序列

力扣3472. 至多 K 次操作后的最长回文子序列

题目

题目解析及思路

题目要求在最多k次操作下返回s的最长回文子序列的长度

就是在最长回文子序列模板下多了一个k次操作

开三维f[K][n-1][n-1]vector<vector<vector<int>>> f(K+1,vector<vector<int>>(n,vector<int>(n)));

f[k][i][j]表示在最多k次操作下,s[i...j]的最长回文子序列的长度

代码

cpp 复制代码
class Solution {
public:
    int longestPalindromicSubsequence(string s, int K) {
        int n = s.size();
        int cnt = 0;
        //优化,如果操作次数够多能将整个字符串弄成回文,直接return
        for(int i=0;i<n/2;i++){
            int d = abs(s[i] - s[n-1-i]);
            cnt += min(d,26-d);
        }
        if(cnt <= K){
            return n;
        }

        vector<vector<vector<int>>> f(K+1,vector<vector<int>>(n,vector<int>(n)));
        //外层枚举啥都行
        for(int k=0;k<=K;k++){
            for(int i=n-1;i>=0;i--){
                f[k][i][i] = 1;
                for(int j=i+1;j<n;j++){
                    //s[i] != s[j]
                    f[k][i][j] = max(f[k][i+1][j],f[k][i][j-1]);
                    //s[i] == s[]或者修改成相同
                    int d = abs(s[i] - s[j]);
                    int op = min(d,26-d);
                    if(op <= k){
                        f[k][i][j] = max(f[k][i][j],f[k-op][i+1][j-1] + 2);
                    }
                }
            }
        }
        return f[K][0][n-1];
    }
};
相关推荐
程序员天天困4 分钟前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH12 分钟前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
z小猫不吃鱼22 分钟前
模型剪枝经典论文精读:DepGraph: Towards Any Structural Pruning
算法·机器学习·剪枝
Ulyanov1 小时前
Python实现6-DOF刚体仿真器(下)——环境扰动与控制闭环
开发语言·python·算法·系统仿真·雷达电子对抗·导引头
牧以南歌〆1 小时前
数据结构<八>链式队列
c语言·数据结构·算法
Reart2 小时前
Leetcode 188.买卖股票的最佳时机4(718)
后端·算法
2601_950760792 小时前
BCMA:急性髓系白血病免疫治疗的新型可行靶点
人工智能·算法·蛋白
怎么比啊都是大神2 小时前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫2 小时前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java
Reart2 小时前
Leetcode 123.买卖股票的最佳时期3(内有随心谈,718)
后端·算法