题解 | #D 智乃与长短期主义者博弈#

智乃办赛

https://ac.nowcoder.com/acm/contest/101918/A

这里一眼盯真发现是一道区间dp,然后就是去写状态转移方程了。

我们定义为当前局势为时,长期主义者可获得最大收益。

那么,当前如果是短期主义者的回合,则有:

当前如果是长期主义者的回合,则有:

那么最终答案分别为:

代码如下:

int main(){
  cin>>n;
  
  ll sum=0;
  for(int i=1;i<=n;i++){
    cin>>a[i];
    sum+=a[i];
  }
  
//   长期者的收益 max( w[l] + f[l+1][r],w[r] + f[l][r-1]) 所以每次要维护这个值
//   然后由这个值去看他的操作
  
  for(int i=1;i<=n;i++){
    f[i][i]=n&1?0:a[i];
  }
      
  for(int len=2;len<=n;len++){
    for(int l=1;l+len-1<=n;l++){
      int r=l+len-1;
      if((n+len)&1) f[l][r]=max(a[l]+f[l+1][r],a[r]+f[l][r-1]);
      else f[l][r]=a[l]>=a[r]?f[l+1][r]:f[l][r-1];
    }
  }
  
  cout<<sum-f[1][n]<<' '<<f[1][n];
}
全部评论
感谢大佬,特别清晰
点赞 回复 分享
发布于 03-20 23:31 江西
非常感谢你的题解!真的帮助了我很多~
点赞 回复 分享
发布于 02-15 16:34 山东

相关推荐

墨西哥大灰狼:如果你的校友卤馆还在的话,他肯定会给你建议的,可是卤馆注销了@ 程序员卤馆
点赞 评论 收藏
分享
评论
16
收藏
分享

创作者周榜

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