zoukankan      html  css  js  c++  java
  • 486. 预测赢家

    定义二维数组 ( extit{dp}),其行数和列数都等于数组的长度,$ extit{dp}[i][j] $表示当数组剩下的部分为下标 (i) 到下标 (j) 时,即在下标范围 ([i, j]) 中,当前玩家与另一个玩家的分数之差的最大值,注意当前玩家不一定是先手。

    只有当 (i le j) 时,数组剩下的部分才有意义,因此当 (i>j) 时,( extit{dp}[i][j]=0)

    (i=j) 时,只剩一个数字,当前玩家只能拿取这个数字,因此对于所有 (0 le i < extit{nums}. ext{length}),都有 ( extit{dp}[i][i]= extit{nums}[i])

    (i<j) 时,当前玩家可以选择 ( extit{nums}[i])( extit{nums}[j]),然后轮到另一个玩家在数组剩下的部分选取数字。在两种方案中,当前玩家会选择最优的方案,使得自己的分数最大化。因此可以得到如下状态转移方程:

    [ extit{dp}[i][j]=max( extit{nums}[i] - extit{dp}[i + 1][j], extit{nums}[j] - extit{dp}[i][j - 1]) ]

    最后判断 ( extit{dp}[0][ extit{nums}. ext{length}-1]) 的值,如果大于或等于 (0),则先手得分大于或等于后手得分,因此先手成为赢家,否则后手成为赢家。

    class Solution {
    public:
        bool PredictTheWinner(vector<int>& nums) {
            int n = nums.size();
            vector<vector<int>> f(n + 1, vector<int>(n));
    
            for(int i = n - 1; i >= 0; i--)
                for(int j = i; j < n; j++)
                    if(i == j) f[i][j] = nums[i];
                    else f[i][j] = max(nums[i] - f[i + 1][j], nums[j] - f[i][j - 1]);
            
            return f[0][n - 1] >= 0;
        }
    };
    
  • 相关阅读:
    记MongoDB的安装
    Python格式化输出指定宽度及占位符
    LMDB数据库加速Pytorch文件读取速度
    IDEA设置输入后自动提示
    IDEA2020 最新激活
    java 编译执行cmd命令
    算法9:What is the sum of the digits of the number 21000
    JAVA8 LocalDateTime
    算法8:已知 a^2+b^2=c^2(a,b,c 为自然数,a<b<c),且a+b+c=1000,求abc的值?
    ROS学习笔记
  • 原文地址:https://www.cnblogs.com/fxh0707/p/14933661.html
Copyright © 2011-2022 走看看