D - Reversed LCS
繁凡さん
设
f
[
l
,
r
,
k
]
f [ l , r , k ]
f[l,r,k] 表示区间
[
l
,
r
]
[ l , r ]
[l,r] 中修改
k
k
k 次能得到的最长回文子序列的长度,直接区间DP转移即可。
字符串的 最长回文子序列(lps) 长度等于其自身与反转的 最长公共子序列(lcs)长度吗?
#include<bits/stdc++.h>
using namespace std;
const int N=310;
int f[N][N][N];
char s[N];
int n,m;
int dfs(int l,int r,int k)
{
if(k<0) return -0x3f3f3f3f;
if(l>r) return 0;
if(l==r) return 1;
if(f[l][r][k]) return f[l][r][k];
return f[l][r][k]=max({dfs(l+1,r,k),dfs(l,r-1,k),dfs(l+1,r-1,k-(s[l]!=s[r]))+2});
}
int main()
{
scanf("%s%d",s+1,&m);
n=strlen(s+1);
printf("%d\n",dfs(1,n,m));
return 0;
}