Leetcode 877 StoneGame

题目

解题方案1:

  1. 整理一下规则:
    Alex、Lee两个人,Alex先手,Lee后手。
    每次只能拿 第一堆 或者 最后一堆
    两个人拿取的策略 都是最优的 都为了打败对方

  2. 方程:
    i 为第一堆石子下标,j 为最后一堆石子下标
    如果 先手 选择 i,则后手只能选择 i+1 或者 j
    如果 先手 选择 j,则后手只能选择 i 或者 j-1

    则先手与后手石子堆的差为:
    piles[i] - opt(piles, i+1, j) 或者 piles[j] - opt(piles, i, j-1)
    opt(piles, i, j) 的意思是从piles数组里下标 ij 中选
    取石子堆的最佳组合。
    因为中间选择过程我们不清楚,所以可以用递归去穷举。

    最终结果只要大于0我们就认为先手胜了

    代码如下:

i = 0
j = len(piles)

def opt(piles, i, j):
   if i==j:
       return piles[i]
   if j>i:
       return max( piles[i] - opt(piles, i+1, j),
                           piles[j] - opt(piles, i, j-1) )

return opt(piles, i, j) > 0

解题方案2:

能用递归的基本都能用递推去解决,递推的过程也就是动态规划。笔者是这么理解的,不一定正确,因为本人觉得递推和动态规划都是递归的一个逆过程,递归是 从问题最终出发,而递推和动态规划都是 从问题的开始出发

具体怎么想到解题的思路,其实我也不知道。可能题做多了就能知道吧,我也是看了别人的答案想了很久才想明白。

解题思路,方案一讲讲述过的就不再累述了

  1. 既然是从 问题的开始出发,那就从游戏开始的第一步来, 这里的 游戏开始 准确的来说应该是从递归的最后一步开始。一开始还是很难理解的,多想想就能明白之中的奇妙了。
    2.方案一递归到底的时候只有一个石子堆,即i=j的情况,然后会不断上升到两个石子堆,三个石子堆取最佳博弈的情况,拿leetcode第一个例子[5,3,4,5]来说的话:
    递归是考虑了只剩下单独石子堆的情况: [5] [3] [4] [5]
    剩下两个石子堆的情况:[5,3] [3,4] [4,5]
    剩下三个石子堆的情况:[5,3,4] [3,4,5]
    最后全集的情况:[5,3,4,5]
    我们需要做的就是 自底而上的把最佳博弈情况求出来 因为单独石子堆的情况最佳博弈情况 是 两个石子堆里求出最佳博弈情况的基础,以此类推。
  2. 最佳博弈情况方程 (状态方程):
    与递归的方程是一样的:
    max( piles[i] - opt(), piles[j] - opt() )
    先手 在当前状态下的选择的石子堆减去 之前两者博弈的石子差(这个过程是累计的来得,即我们要每次记住当前人选择的石子与后者选择的石子差)。
    举个例子
    因为递归最后一步是后手选择,转为递推和动态规划的话,后手是第一步。
    设A为 先手, B为 后手
    [5,3,4,5]
    假设A选择了第一个5,则B可以选择3或者5,为了得到最佳博弈,B会选择5,此时的opt就为5。因为A选择了5,此时的opt就是5-5=0。
    接下来A肯定选择4, 则B就只能选择3了,B选择后的最佳博弈结果是3-0=3,A选择后的最佳博弈结果就是4-3=1。
    这里是需要好好理解一下的。
    3.因为最佳博弈结果是要被记录下来然后被后者使用的,就是为了避免递归过程中重复计算一样的子过程。
    考虑到有两个变量选最左边i还是选最右边j,这里就构建二维数组opt[N][N]来记录了。N为piles数组的长度。
    opt[i][j]是用来记录所有子问题的最佳博弈结果,因此就有在方案2上面说的所有情况。这就是用二维数组记录的原因。
    opt[1][3]表示piles[1]到piles[3]中的最佳博弈结果。
    从单个情况opt[N][N]开始推到全集opt[0][N], 然后这个opt[0][N]就是我们需要求得的最后结果。

代码如下:
上面谈到的opt改成了dp

dp = [ [0 for _ in range (0,length)] for _ in range (0,length)]

for i in range (0,length):
    dp[i][i] = piles[i]
    
for i in range (length-2,-1,-1):

    for j in range (i+1,length):

        dp[i][j] = max( piles[i] - dp[i+1][j], piles[j] - dp[i][j-1] )

return dp[length-1][length-1] > 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,194评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,058评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,780评论 0 346
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,388评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,430评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,764评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,907评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,679评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,122评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,459评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,605评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,270评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,867评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,734评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,961评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,297评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,472评论 2 348

推荐阅读更多精彩内容

  • 题目链接难度: 中等 类型:动态规划 亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都...
    wzNote阅读 7,661评论 0 1
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,333评论 0 2
  • 问题描述:【DP】712. Minimum ASCII Delete Sum for Two Strings 解题...
    牛奶芝麻阅读 493评论 0 0
  • 博弈类问题的套路都差不多,下文举例讲解,其核心思路是在二维 dp 的基础上使用元组分别存储两个人的博弈结果。掌握了...
    6默默Welsh阅读 878评论 0 0
  • 今天双十一,大家从昨晚凌晨就开始忙着抢购,买这买那的,我啥都没买呵呵!我觉得双十一肯定有猫腻,也不一点就是便宜多少...
    王飞妈妈阅读 125评论 0 0