拿硬币
Question: 有10个硬币,我和你按顺序拿,每次可以拿1、2或者4个,拿到最后一个硬币的人输,你怎么确保自己可以获胜
(这个问题的有一个前提:双方都想赢,并且当遇到能赢的情况时,他们能做出正确的决策而不是随便决策)
这种问题,可以从简单情况先想起,:
没有硬币剩下,则默认该轮次的人胜利。
剩下一个硬币时,先手拿硬币的人输,后手赢;
剩下两个硬币时,先手的人一下子拿两个,则先手输。
先手的人拿一个,刚才推过,可以知先手赢。
所以,面对这种情况,先手时你可以认为你赢定了。、剩下三个硬币时,先手的人如果只拿一个,剩下两个硬币,则我们刚才推过,这种情况你会输。
先手的人如果拿两个,剩下一个硬币,你赢。
所以,对于这种情况,先手的人也赢定了。剩下四个硬币时,先手的人拿四个,则先手人会输。
先手如果拿两个,我们刚才推过,先手也输定了。
先手如果拿一个,也是上面推过,先手输定了。
…..
依此下来,我们是不是发现,对于固定的剩余硬币数量,先手还是后手直接可以决定你的输赢。
其实,这是利用了动态规划的思想。
我们假设f(i)表示结果,0表示输,1表示赢。
当轮到你去取硬币时,我们假设面前有i枚硬币,你有三种取法(即取 1,2,4),当你取完就该对手取,如果说三种取法里面只有有一个取法能够让对手最后输掉,那么可以说你就赢了。
写成状态转移方程:
f(i)=(f(i-1)==0 || f(i-2)==0 || f(i-4)==0 ) ①
状态推算:
f(0)=1
f(1)=0
f(2)=1
f(3)=1