zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    c语言中srand和rand函数 生成随机数总结
    枚举类型
    VS2008快捷键使用技巧
    PV实现同步
    PV操作(深入显出)
    数字在排序数组中出现的次数
    两个链表的第一个公共结点
    数组中的逆序对
    第一个只出现一次的字符位置
    丑数
  • 原文地址:https://www.cnblogs.com/xxswkl/p/12267841.html
Copyright © 2011-2022 走看看