D的实现细节有什么问题?

我D题的dp[i][j]定义的是当前玩家在区间 [i,j] 内的得分减去对手在剩余区间内的得分

然后转移起来这么些不清楚哪里有bug

#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1010];
int dp[1010][1010];
signed main()
{
    int n;
    cin>>n;
    int i;
    for(i=1;i<=n;i++)
    cin>>a[i];
    for(i=1;i<=n;i++)
    {
        dp[i][i]=a[i];
    }
    int len;
    for(len=2;len<=n;len++)
    {
        for(i=1;i<=n-len+1;i++)
        {
            int j=i+len-1;
            int ok=(len%2==1);
            if(ok==0)//hou手
            {
                dp[i][j]=max(a[i]-dp[i+1][j],a[j]-dp[i][j-1]);
            }
            else
            {
                if(a[i]>=a[j])
                dp[i][j]=a[i]-dp[i+1][j];
                else
                dp[i][j]=a[j]-dp[i][j-1];
            }
        }
    }
    int d=dp[1][n];
    cout<<d<<endl;
    int sum=0;
    for(i=1;i<=n;i++)
    sum+=a[i];
    cout<<(d+sum)/2<<" "<<sum-(d+sum)/2;
    return 0;
}

全部评论
你的先后手判断的逻辑是有误的,int ok=(len%2==1); 这里len表示剩余区间,如果n一开始是奇数,那么len是偶数的时候轮到后手,否则先手,但是如果n一开始是偶数就完全相反了。所以这里要改成(n-len)%2去判断先后手
点赞 回复 分享
发布于 02-15 09:33 江苏

相关推荐

notbeentak...:孩子,说实话,选择很重要,可能你换一个方向会好很多,但是现在时间不太够了,除非准备春招
点赞 评论 收藏
分享
10-13 16:58
门头沟学院 Java
面了100年面试不知...:一周七天,一天去一家上班😍😍😍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务