LeetCode 1140. Stone Game II解题报告(python)

1140. Stone Game II

  1. Stone Game II python solution

题目描述

Alex and Lee continue their games with piles of stones. There are a number of piles arranged in a row, and each pile has a positive integer number of stones piles[i]. The objective of the game is to end with the most stones.
Alex and Lee take turns, with Alex starting first. Initially, M = 1.
On each player’s turn, that player can take all the stones in the first X remaining piles, where 1 <= X <= 2M. Then, we set M = max(M, X).
The game continues until all the stones have been taken.
Assuming Alex and Lee play optimally, return the maximum number of stones Alex can get.
在这里插入图片描述

解析

使用动态规划,使用A[i]表示piles[i:]中以[1,2*M]为取值范围可以取的最多石子数
动态规划的方程如下所示
f ( i , m ) = A [ i ] − m i n ( f ( i + x , m a x ( M , x ) ) ) f(i,m) = A[i]-min(f(i+x,max(M,x))) f(i,m)=A[i]min(f(i+x,max(M,x)))
如果想让亚历克斯拿的尽可能多,那么我们就应该让李少拿。亚历克斯拿到最多的石子个数是,整体的石子个数减去李拿最少的石子,即min(f(i+x,max(M, x)))。

from functools import lru_cache
class Solution:
    def stoneGameII(self, A: List[int]) -> int:
        N = len(A)
        for i in range(N - 2, -1, -1):
            A[i] += A[i + 1]
        from functools import lru_cache
        @lru_cache(None)
        def dp(i, m):
            if i + 2 * m >= N: return A[i]
            return A[i] - min(dp(i + x, max(m, x)) for x in range(1, 2 * m + 1))
        return dp(0, 1)

Reference

https://leetcode.com/problems/stone-game-ii/discuss/345230/Python-DP-Solution
https://blog.csdn.net/qq_17550379/article/details/97757641

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值