问题描述:

Pots of gold game: Two players A & B. There are pots of gold arranged in a line, each containing some gold coins (the players can see how many coins are there in each gold pot - perfect information). They get alternating turns in which the player can pick a pot from one of the ends of the line. The winner is the player which has a higher number of coins at the end. The objective is to "maximize" the number of coins collected by A, assuming B also plays optimally. A starts the game.
The idea is to find an optimal strategy that makes A win knowing that B is playing optimally as well. How would you do that?

简单来说就是很多金币罐排成一行,两个人轮流拿钱。每次只能拿走线端的罐,也就两种选择。A先开始,问你A应该用什么策略使得拿到的钱尽可能多。B也很聪明,每次也是“最优”决策

解答:

非常巧妙,动态规划在这里用上了.

因为每次A只有两种选择,选择头部或者尾部的金币罐。我们不妨假设选择头部,那么此时轮到B选择了,B也有两种选择,选择此时的“头部”或者”尾部”。注意到问题是包括了子问题的优化解的,这个特性比较明显就不多做说明了,可以这么理解,“英明”决策是由一个个小的“英明”决策组成。

所以我们可以采用动态规划的方式来解决

   1:  function max_coin( int *coin, int start, int end ):
   2:      if start > end:
   3:          return 0
   4:      
   5:      int a = coin[start] + 

max

( max_coin( coin, start+2,end ), max_coin( coin, start+1,end-1 ) )
   6:      int b = coin[end] + 

max

( max_coin( coin, start+1,end-1 ), max_coin( coin, start,end-2 ) )
   7:      
   8:      return max(a,b)

大家看看这个代码,仔细研究一下有没有问题。

我们来分析一下,锁定第五句,我们用自然语言来解释一下这一句。A选择了线首钱罐,然后根据B的选择有两种情况,去两种情况下的最优解。最优解,最优。。。

分析到这儿,大家有没有感觉到问题的出现?没有的话我们再来看一下。

A选择最优解!这是什么意思,意思就是说B的选择对A没有影响!因为无论B选择是什么,A的选择是一定的。

这显然是不合理的!

所以正确的代码应该是

   1:  function max_coin( int *coin, int start, int end ):
   2:      if start > end:
   3:          return 0
   4:      
   5:      int a = coin[start] + min( max_coin( coin, start+2,end ), max_coin( coin, start+1,end-1 ) )
   6:      int b = coin[end] + min( max_coin( coin, start+1,end-1 ), max_coin( coin, start,end-2 ) )
   7:      
   8:      return max(a,b)

看着这段代码,大家可能感觉怪怪的,因为好像就算换成min也不一定就说明B影响到了A的选择。看起来像那么回事,但是对不对呢?

说实话,我没法严谨去证明。

暂时这么理解吧,B采取了一个策略,那就是处处为难A,每次选择遵循了一个原则,那就是使得接下来A获得的总钱币数目尽可能少。A尽可能少那么B也就自然尽可能多了。

QUORA上有这么一段代码,也可以看看,不错的

http://www.quora.com/Dynamic-Programming/How-do-you-solve-the-pots-of-gold-game

 pots = [...]

 cache = {}
def optimal(left, right, player):
if left > right:
return 0
if (left, right, player) in cache:
return cache[(left, right, player)]
if player == 'A':
result = max(optimal(left + 1, right, 'B') + pots[left],
optimal(left, right - 1, 'B') + pots[right])
else:
result = min(optimal(left + 1, right, 'A'),
optimal(left, right - 1, 'A'))
cache[(left, right, player)] = result
return result answer = optimal(0, len(pots)-1, 'A')

Pots of gold game:看谁拿的钱多的更多相关文章

  1. POJ_2392_Space_Elevator_(动态规划,背包)

    描述 http://poj.org/problem?id=2392 磊方块,每种方块有数量,高度,以及该种方块所能处在的最高高度.问最高磊多高? Space Elevator Time Limit: ...

  2. 使用Unity创建塔防游戏(Part1)

    How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...

  3. 使用unity创建塔防游戏(原译)(part1)

    塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...

  4. [设计模式] javascript 之 代理模式

    代理模式说明 说明:顾名思义就是用一个类来代替另一个类来执行方法功能,这个模式跟装饰模式有点相似,不一样的是,代理模式是代替客户初始化被代理对象类,而装饰模式采用接口或初装饰者参数引用的方式来执行的. ...

  5. python(4) - 装饰器

    由于函数也是一个对象,既然是对象就可以将它赋给变量,通过变量来调用该函数 def now(): print('2016-01-01') f = now #注意,这里不能带(),函数带上()表示执行函数 ...

  6. [笨木头FireFly 02]入门篇2_客户端发送请求,服务器处理请求

    原地址:http://www.9miao.com/question-15-53940.html 好,经过上一篇不权威的讲解,大家已经能轻易地让客户端和服务端连接起来了. 但是,仅仅是连接了,可它们俩不 ...

  7. 前阿里CEO卫哲谈阿里创业经验:如何找人、找钱、找方向?(不同的阶段分别有:时间优先、金额优先、比例优先,不要做平台,太难)

    新浪科技李根 整理报道 卫哲现在是御嘉基金的创始合伙人,他另一个更加知名的身份是阿里巴巴(B2B)前CEO,在2006年到2011年的时间里,卫哲见证了阿里巴巴如何利用人才.资本和方向选择一路壮大. ...

  8. 程序猿接私活经验总结,来自csdn论坛语录

    下面为网上摘录,以做笔记: 但是到网上看看,似乎接私活也有非常多不easy,技术问题本身是个因素,还有非常多有技术的人接私活时被骗,或者是合作到最后以失败告终,所以想请有经验的大侠们出来指点一下,接私 ...

  9. iOS RunTime你知道了总得用一下

    说点题外话: 我刚来现在这家公司的时候,老板让我下载一个脉脉,上去找找自己的同行,多认识些同行.其实初衷的好的,但最近这两天我把它卸载了,不为别的,负能量太多!iOS这行自从2016就没景气过,在这行 ...

随机推荐

  1. chrome下的js调试

    console输出对象信息:console.log(object[,object,.....])

  2. 社保系列7《PSAM卡》

    PSAM卡用于商户POS.网点终端.直联终端等端末设备上,负责机具的安全控管.PSAM卡具有一定的通用性.经过个人化处理的PSAM卡能在不同的机具上使用. PSAM卡支持多级发卡的机制,各级发卡方在卡 ...

  3. 2天驾驭DIV+CSS (实战篇)(转)

     这是去年看到的一片文章,感觉在我的学习中,有不少的影响.于是把它分享给想很快了解css的兄弟们.本文是实战篇. 基础篇[知识一] “DIV+CSS” 的叫法是不准确的[知识二] “DIV+CSS” ...

  4. 用Swift重写公司OC项目(Day1)--程序的AppIcon与LaunchImage如何设置

    公司之前的APP呢经过了两次重写,都是使用OC由本人独立开发的,不过这些东西我都不好意思说是自己写的,真心的一个字:丑!!! 客观原因来说主要是公司要的特别急,而且注重的是功能而非效果,公司的美工之前 ...

  5. [小技巧]让C#的空值处理变得更优雅

    参考 http://www.codeproject.com/Articles/739772/Dynamically-Check-Nested-Values-for-IsNull-Values?msg= ...

  6. 转Oracle字符集问题总结

    Oracle字符集问题总结 分类: Oracle2006-06-04 13:48 1298人阅读 评论(3) 收藏 举报 oracle数据库sqlcharacter存储insert 作者: vston ...

  7. Elasticsearch 权威指南 NESTAPI地址

    Elasticsearch 权威指南:http://fuxiaopang.gitbooks.io/learnelasticsearch/content/index.html NEST:http://n ...

  8. Keystore概念,Keytool工具使用

    几个概念 keystore是一个密码保护的文件,用来存储密钥和证书(也就是说,keystore中存储的有两类型entries):这个文件(默认的)位于你的home目录,也就是你登录到操作系统的用户名的 ...

  9. 第九章 CSS-DOM

    另一个网友整理了很多书中的代码:http://www.cnblogs.com/jingangel/archive/2013/01/03/2843505.html 1. 三位一体的网页 浏览器看到的网页 ...

  10. python 交换变量值

    在其他语言中,交换两个变量值的时候,可以这样写: temp = a a = b b = temp 在Python中,我们可以简单的这样写: a,b=b,a 实验如下: >>> a=1 ...