有现在有 t 个字符串,对于每个字符串 s,记字符串的长度为 ∣,字符串下标从 1 开始。接着小 Y 指定了k 个特殊位置。小 Y 想知道,包含特殊位置所在的字符最多的情况下,字符串 s 的最长回文子序列长度是多少。小 Z 需要找到包含特殊位置最多的回文子序列,如果有多个子序列能够使得包含特殊位置的字符数量最大化,那么就必须输出t中最长的回文子序列的长度。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e3+3;
int dp[maxn][maxn],mx[maxn][maxn],n,k,x;
char s[maxn];
bool vis[maxn];
int main(){
int t;
cin>>t;
for(int i=0;i<t;i++){
scanf("%s",s+1);
memset(vis,false,sizeof(vis));
memset(dp,0,sizeof(dp));
memset(mx,0,sizeof(mx));
n=strlen(s+1);
cin>>k;
while(k--){
cin>>x;
vis[x]=true;
}
for(int i=1;i<=n;i++){
dp[i][i]=1;
mx[i][i]=vis[i];
}
for(int len=2;len<=n;len++){
for(int i=1;i+len-1<=n;i++){
int j=i+len-1;
if(mx[i][j]<mx[i][j-1]){
mx[i][j]=mx[i][j-1];
dp[i][j]=dp[i][j-1];
}else{
dp[i][j]=max(dp[i][j],dp[i][j-1]);
}
if(mx[i][j]<mx[i+1][j]){
mx[i][j]=mx[i+1][j];
dp[i][j]=dp[i+1][j];
}else{
dp[i][j]=max(dp[i][j],dp[i+1][j]);
}
if(s[i]==s[j]){
int cnt=vis[i]+vis[j];
if(mx[i][j]<mx[i+1][j-1]+cnt){
mx[i][j]=mx[i+1][j-1]+cnt;
dp[i][j]=dp[i+1][j-1]+2;
}else{
dp[i][j]=max(dp[i][j],dp[i+1][j-1]+2);
}
}
}
}
cout<<dp[1][n]<<endl;
}
return 0;
}
能不能来个dalao帮我调试一下,找个错误(输出部分是对的)