求助,悬赏一关注
查看原帖
求助,悬赏一关注
514343
I_Love_QingYu楼主2024/3/9 18:41
#include <iostream>
#include <cstdio>
#include <algorithm>
#define mod 998244353
using namespace std;
long long int dp[3003][3003][2],a[1003];
long long int mi(long long int x,long long int y){
    long long int sum=1;
    if(y==0&&x==0)
        return 0;
    while(y){
        if(y&1)sum=sum*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return sum;
}
int main()
{
    int t;
    cin>>t;
    while(t--){
        long long int n,ans=0;
        cin>>n;
        for(int i=1;i<=n;i++)  
            scanf("%lld",&a[i]);
            for(int i=1;i<=n+2;i++)
                for(int j=i;j<=n+2;j++)
                    dp[i][j][0]=dp[i][j][1]=0;
            dp[1][n-1][1]=n;
            dp[2][n][1]=1;
            dp[3][n+1][1]=0;
            a[n+1]=0;
           for(int j=n-2;j>0;j--)
                for(int l=1,r=j;r<=n;r++,l++){
                    if(dp[l][r+1][0]+mi(a[dp[l][r+1][1]],a[r+1])<dp[l-1][r][0]+mi(a[dp[l-1][r][1]],a[l-1])){
                        if(l-1>0)
                            dp[l][r][0]=dp[l-1][r][0]+mi(a[dp[l-1][r][1]],a[l-1]);
                        dp[l][r][1]=l-1;
                    }
                    else
                        if(dp[l][r+1][0]+mi(a[dp[l][r+1][1]],a[r+1])==dp[l-1][r][0]+mi(a[dp[l-1][r][1]],a[l-1]))
                            if(a[dp[l][r+1][1]]>a[dp[l-1][r][1]])
                            {
                                if(r+1<=n)
                                    dp[l][r][0]=dp[l][r+1][0]+mi(a[dp[l][r+1][1]],a[r+1]);
                                dp[l][r][1]=r+1;
                            }
                            else{
                                if(l-1>0)
                                    dp[l][r][0]=dp[l-1][r][0]+mi(a[dp[l-1][r][1]],a[l-1]);
                                 dp[l][r][1]=l-1;
                            }
                        else{
                            if(r+1<=n)
                                    dp[l][r][0]=dp[l][r+1][0]+mi(a[dp[l][r+1][1]],a[r+1]);
                                dp[l][r][1]=r+1;
                        }
                        
                }
        for(int i=1;i<=n;i++)
            ans=max(ans,dp[i][i][0]+mi(a[dp[i][i][1]],a[i]));
        printf("%lld\n",ans);
    }
    return 0;
}

2024/3/9 18:41
加载中...