前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >486. 预测赢家

486. 预测赢家

作者头像
CaesarChang张旭
发布2021-06-29 10:19:01
2920
发布2021-06-29 10:19:01
举报
文章被收录于专栏:悟道

给定一个表示分数的非负整数数组。 玩家 1 从数组任意一端拿取一个分数,随后玩家 2 继续从剩余数组任意一端拿取分数,然后玩家 1 拿,…… 。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。 给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。 示例 1: 输入:[1, 5, 2] 输出:False 解释:一开始,玩家1可以从1和2中进行选择。 如果他选择 2(或者 1 ),那么玩家 2 可以从 1(或者 2 )和 5 中进行选择。如果玩家 2 选择了 5 ,那么玩家 1 则只剩下 1(或者 2 )可选。 所以,玩家 1 的最终分数为 1 + 2 = 3,而玩家 2 为 5 。 因此,玩家 1 永远不会成为赢家,返回 False 。

代码语言:javascript
复制
class Solution {
    public boolean PredictTheWinner(int[] nums) {
        /**
        动态规划
            dp[i][j]: 当前玩家在数组[i:j]中先手,当前玩家所赢过对方的分数。
         */
         int n=nums.length;
         int[][] dp=new int[n][n];
         for(int i=0;i<n;i++){
             dp[i][i]=nums[i];//对角线上的 在i,i中选择  只能选择num[i]
         }
         for(int i=n-2;i>=0;i--){
             for(int j=i+1;j<n;j++){
                 //选择开头i 那么另一选择 [i+1,j]
                  //选择结尾j 那么另一选择 [i,j-1]
                 dp[i][j]=Math.max(nums[i]-dp[i+1][j],nums[j]-dp[i][j-1]);
             }
         }
         return dp[0][n-1]>=0;//当前玩家在数组[i:j]中先手,当前玩家所赢过对方的分数。
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/06/26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档