b_lc_石子游戏 VII(区间dp套博弈)

一排 n 块石子。每个回合,可从行中 移除 最左边的石头或最右边的石头,并获得与该行中剩余石头值之 和 相等的得分。当没有石头可移除时,得分较高者获胜。Bob总是输,Alice总是赢,所以Bob尽力 减小得分的差值,而爱丽丝最大限度地 扩大得分的差值。Alice先手,问比赛结束时的最大得分差值(即Alice赢的分数)

思路:f[i][j]表示剩余stone[i,j]时的最大得分差值

  • 我取最左边的石子时,能拿到的分数是s[j]-s[i],因为后手也是聪明的,所以我能赢的分数就是s[j]-s[i]-f[i+1][j]
  • 我取最右边的石子时,能拿到的分数是s[j-1]-s[i-1],因为后手也是聪明的,所以我能赢的分数就是s[j-1]-s[i-1]-f[i][j-1]

迭代写法

class Solution:
    def stoneGameVII(self, A: List[int]) -> int:
        n=len(A)
        f,s=[[0]*(n+1) for i in range(n+1)], [0]*(n+1)
        for i in range(n):
            s[i+1]=s[i]+A[i]

        for l in range(2,n+1):
            for i in range(1,n-l+2): #i∈[1,n-l+1],比如n=5,l=2时,i=4,j=4+2-1
                j=i+l-1
                f[i][j]=max(s[j]-s[i]-f[i+1][j], s[j-1]-s[i-1]-f[i][j-1])
        return f[1][n]

递归,慢一倍

class Solution:
    def stoneGameVII(self, A: List[int]) -> int:
        def get(l,r):
            return s[r]-s[l]
        @cache
        def dfs(l,r):
            if l==r: return 0
            return max(get(l,r)-dfs(l+1,r), get(l-1,r-1)-dfs(l,r-1))

        n=len(A)
        s=[0]*(n+1)
        for i in range(n):
            s[i+1]=s[i]+A[i]
        ans=dfs(1,n)
        dfs.cache_clear()
        return ans
posted @   童年の波鞋  阅读(87)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系统下SQL Server数据库镜像配置全流程详解
· 现代计算机视觉入门之:什么是视频
· 你所不知道的 C/C++ 宏知识
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
阅读排行:
· DeepSeek V3 两周使用总结
· 02现代计算机视觉入门之:什么是视频
· C#使用yield关键字提升迭代性能与效率
· 回顾我的软件开发经历(1)
· 2. 什么?你想跨数据库关联查询?
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.