486预测赢家

题目:给定一个表示分数的非负整数数组。 玩家1从数组任意一端拿取一个分数,随后玩家2继续从剩余数组任意一端拿取分数,然后玩家1拿,……。每次一个玩家只能拿取一个分数,分数被拿取之后不再可取。直到没有剩余分数可取时游戏结束。最终获得分数总和最多的玩家获胜。给定一个表示分数的数组,预测玩家1是否会成为赢家。你可以假设每个玩家的玩法都会使他的分数最大化。

来源:https://leetcode-cn.com/problems/predict-the-winner/

法一:自己的代码  类似877石子游戏

思路:同石子游戏,只不过这个有奇数有偶数

from typing import List
class Solution:
    def PredictTheWinner(self, nums: List[int]) -> bool:
        size = len(nums)
        # 偶数先手必赢
        if size // 2 == 0 or size == 1:
            return True
        dp = [[0]*size for i in range(size)]
        # 初始化
        for i in range(size):
            dp[i][i] = (nums[i], 0)
        for start_col in range(1, size):
            row = 0
            for col in range(start_col,size):
                left = nums[row] + dp[row+1][col][1]
                right = nums[col] + dp[row][col-1][1]
                # 这个行不通,因为是二者博弈,你当前的最优解,当增加长度时会变成对方的最优解
                # if left > s or right > s:
                #     return True
                if left >= right:
                    player2 = dp[row+1][col][0]
                    dp[row][col] = (left,player2)
                else:
                    player2 = dp[row][col-1][0]
                    dp[row][col] = (right,player2)
                row += 1
        print(dp)
        return True if dp[0][-1][0] >= dp[0][-1][1] else False
if __name__ == '__main__':
    duixiang = Solution()
    a = duixiang.PredictTheWinner([1,5,2])
    print(a)
View Code

ttt

posted on 2020-02-06 10:37  吃我一枪  阅读(176)  评论(0编辑  收藏  举报

导航