文章目录

  • 题目分析
    • 状态表示
    • 状态转移
  • 题目链接

题目分析

补充博弈论的做题想法:让最坏情况下最好。在很多决策中,考虑所有的最坏情况,选其中最好的一个。

本题分析:
刚开始因为是个贪心题目,两个人每次从两侧选择最小的,这样不是每个人不是最优的嘛,结果发现不是。所以这不是一道贪心题。

本题是到区间dp的题目:

状态表示

f[i][j]f[i ][j ]f[i][j]表示 当前局面是 stones[i,j]stones[i, j]stones[i,j]的话,先手减后手的得分的最大值

答案是f[1,n]f[1,n]f[1,n]表示当前局面是 stones[1,n]stones[1,n]stones[1,n]的话,先手减后手的得分的最大值

状态转移

下面分析状态转移:

对于 局面stones[i,j]stones[i, j]stones[i,j],先手A有两种取法:

如果A先取 i :先手得分是s[i+1,j](其中s表示求和)s[i+1,j] (其中s表示求和)s[i+1,j](其中s表示求和),此时后手的局面是 stones[i+1,j]stones[i+1, j]stones[i+1,j],后手也是极端聪敏的人,会选择对自己最有利的,此时对于B而言他是先手,他的最优解是f[i+1,j]f[i+1,j]f[i+1,j],此时f[i+1,j]f[i+1,j]f[i+1,j]存的是B-A(先手- 后手)的最大值。

我们考虑Alice的 最坏情况,是什么呢? 就是A-B的最小值, 等价转换就是 后手B的最大值,即f[i+1,j]f[i+1,j]f[i+1,j] 。所以A先选i 的话,最坏情况下的分值为是s[i+1,j]−f[i+1,j]是s[i+1,j]-f[i+1,j]是s[i+1,j]−f[i+1,j].

如果A先选j,同理,A的得分是s[i,j−1]s[i,j-1]s[i,j−1],此时后手局面是 stones[i,j−1]stones[i, j-1]stones[i,j−1],B的最优解 f[i,j−1]f[i, j-1]f[i,j−1],A的最坏情况下得分就是s[i,j−1]−f[i,j−1]s[i,j-1]-f[i,j-1]s[i,j−1]−f[i,j−1]

总的情况是:先手A最坏情况要求最好,对上面两个式子取max。

所以,状态转移方程:
f[i][j]=max(s(i+1,j)−f[i+1][j],s(i,j−1)−f[i][j−1])f[i][j] = max ( s(i+1,j)-f[i+1][j],s(i,j-1)-f[i][j-1])f[i][j]=max(s(i+1,j)−f[i+1][j],s(i,j−1)−f[i][j−1])
这里s为求和,可以使用前缀和优化,如下代码这里s为求和,可以使用前缀和优化,如下代码这里s为求和,可以使用前缀和优化,如下代码

ac代码

class Solution {public:int stoneGameVII(vector<int>& stones) {int n=stones.size();vector<int> s(n+1); //前缀和数组:下标从1开始for(int i=1;i<=n;i++) s[i]=s[i-1]+stones[i-1];//因为stone下标从0开始vector<vector<int>> f(n+1,vector<int>(n+1)); //二维数组f大小//区间dp先枚举区间长度for(int len=2;len<= n ;len ++){//再枚举左端点for(int i=1;i+len-1<=n;i++){int j=i+ len -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];}
};

二维vector声明大小请参考笔者另外一篇博客文章:二维vector的声明和初始化

题目链接

Leetcode1690. 石子游戏 VII

Leetcode1690. 石子游戏 VII[C++题解]:带有博弈论的区间dp相关推荐

  1. Leetcode1686. 石子游戏 VI[C++题解]:博弈论、按照a+b贪心

    文章目录 题目分析 题目链接 题目分析 博弈论:最坏情况下求最好. 按a[i]+b[i]a[i] + b[i ]a[i]+b[i] 从大到小排序 解释: (博弈论)每个人最优的选择都是 要求自己的−对 ...

  2. LeetCode 1690.石子游戏VII

    LeetCode 1690.石子游戏VII 问题描述: 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的 ...

  3. Python每日一练(20230510) 石子游戏 VII\VIII\IX

    目录 1. 石子游戏 Stone Game VII 2. 石子游戏 Stone Game VIII 3. 石子游戏 Stone Game IX

  4. 【数据结构与算法】之深入解析“石子游戏VII”的求解思路与算法示例

    一.题目描述 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排,每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获得与该行中剩余石头值之和相等的得 ...

  5. LeetCode 1690. 石子游戏 VII(博弈DP)

    文章目录 1. 题目 2. 解题 1. 题目 石子游戏中,爱丽丝和鲍勃轮流进行自己的回合,爱丽丝先开始 . 有 n 块石子排成一排.每个玩家的回合中,可以从行中 移除 最左边的石头或最右边的石头,并获 ...

  6. 取石子游戏,程序员用博弈论教你如何必胜

    1.游戏规则 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子(至少取1个). 每次有两种不同的取法,规则如下: 1.一是可以在任意的一堆中取走任意多的石子:2.二是可以在两堆中同时取走相同 ...

  7. 动态规划:5627、石子游戏VII

    思路:用dp[i][j]表示i到j的区间和,用res[i][j]表示本次操作后该选手在i与j区间获得的最大价值差,所以无论是爱丽丝还是鲍勃,在每次操作时都是为了获得最大价值差,才能保证题意,即爱丽丝无 ...

  8. LeetCode 1686. 石子游戏 VI(贪心)

    文章目录 1. 题目 2. 解题 283 / 1660,前17% 681 / 6572,前10.4% 1. 题目 Alice 和 Bob 轮流玩一个游戏,Alice 先手. 一堆石子里总共有 n 个石 ...

  9. leetcode——石子游戏系列题目

    石子游戏 亚历克斯和李用几堆石子在做游戏.偶数堆石子排成一行,每堆都有正整数颗石子 piles[i] . 游戏以谁手中的石子最多来决出胜负.石子的总数是奇数,所以没有平局. 亚历克斯和李轮流进行,亚历 ...

最新文章

  1. java 调用webservice的各种方法总结
  2. 微软:Windows 7 SP1将于本月正式发布
  3. nginx重新编译安装mysql_Centos 6.5编译安装Nginx+php+Mysql
  4. python传递指针_使用Python / C API传递C指针
  5. 为什么国内SaaS很难爆发
  6. Android Bitmap和Canvas学习笔记
  7. 多中心容灾实践:如何实现真正的异地多活?
  8. 如何造一个“钉钉”?谈谈消息系统架构的实现
  9. html改变占位字符的颜色,使用CSS更改HTML5输入的占位符颜色
  10. LINUX双击无法启动解决一例
  11. avast注册号|好用的avast注册号|没过期avast注册号
  12. 无人机动力测试台的应用-测试高转速下的无人机螺旋桨结冰和脱落
  13. steam安裝位置linux,steam盒子
  14. 一个将Google Maps API与ArcGIS JavaScript API for GMaps结合的例子
  15. 邮件多面手!Foxmail 6.5正式版新体验
  16. java对象转json格式化_Java对象转json JsonFormat注解
  17. 纳豆的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  18. PHP使用自带的ZipArchive类,实现压缩文件目录
  19. IT产品经理眼中两种很特别很特别的程序员
  20. 几大搜索引擎收录入口

热门文章

  1. ruby简单的基础 4
  2. make file教程(转)
  3. 做报表时用到的一个存储过程
  4. struts2前台获取setattribute为空指针异常_告诉你,这样设计 Java 异常更优雅,更牛逼!...
  5. stm32 usart 单线半双工串口 DMA发送 最后一个字节发不出来问题
  6. 【PC工具】GiliSoft Video Editor目测还可以的视频制作工具,视频裁剪、转换、合并、加水印、加特效...
  7. 10.Verilog状态机使用方法
  8. 基于FPGA的目标点的提取与定位系统设计
  9. Linux vi/vim使用方法 总结
  10. C1之路 | 备考C1