zoukankan      html  css  js  c++  java
  • 石子游戏(Leetcode每日一题)

    https://leetcode-cn.com/problems/stone-game/

    定义状态数组:dp[i][j]表示还剩下i~~~j个石子时,当前选手和另一个选手的最大差值。

    如果当前选手选第i个,dp[i][j]=nums[i] - dp[i+1][ j ],为什么是这样呢?假设当前选手A选择了第i堆石子,dp[i+1][j]表示的应该是选手B-选手A的石子,nums[i]-dp[i+1][j]就相当于nums[i]+选手A的石子-选手B的石子,就是他们的差值,如果选第j个的话,dp[i][j]=nums[j]-dp[i][j-1],然后取最大值就好了。

    code:

    class Solution {
    public:
        int dp[30][30];
        bool PredictTheWinner(vector<int>& nums) {
            for(int i=0;i<nums.size();i++)  dp[i][i]=nums[i];
            for(int k=2;k<=nums.size();k++){
               for(int i=0;i+k-1<nums.size();i++){
                   dp[i][i+k-1]=max(nums[i]-dp[i+1][i+k-1],nums[i+k-1]-dp[i][i+k-2]);
               }
            }
            return dp[0][nums.size()-1]>=0;
        }
    };

     另外还有一个数学算法,但是文字太多了,看的很迷....如果是偶数堆石子的话,一定是先手赢,即直接return true即可。

  • 相关阅读:
    <LinkedList> 61
    <LinkedList> (hard + 高)25
    <DP> (高频)322
    <BackTracking> (dfs hard) 291
    <Tree> (高频)236
    <Math> 29 365
    <String> 161 358
    <Array> 309 (高)334
    <Array> 54 (高频+hard )45
    <Design> 359 346
  • 原文地址:https://www.cnblogs.com/Accepting/p/13598703.html
Copyright © 2011-2022 走看看