D - Reversed LCS
繁凡さん
设 f[l,r,k]f [ l , r , k ]f[l,r,k] 表示区间 [l,r][ l , r ][l,r] 中修改 kkk 次能得到的最长回文子序列的长度,直接区间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;
}