我看到了一道题
  • 板块灌水区
  • 楼主zcx0628
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/14 10:56
  • 上次更新2024/7/14 12:12:52
查看原帖
我看到了一道题
779007
zcx0628楼主2024/7/14 10:56
有现在有 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帮我调试一下,找个错误(输出部分是对的)

2024/7/14 10:56
加载中...