力扣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];
}
};