今盒子里有n个小球,A、B两人轮流从盒中取球,每个人从盒子中取出的球的数目必须是:1,3,7或者8个。
A先取球,然后双方交替取球,直到取完。
被迫拿到最后一个球的一方为负方(输方)
请编程确定出在双方都不判断失误的情况下,对于特定的初始球数,A是否能赢?
public class main2 {
static Map map=new HashMap();
public static void main(String[] args) {
map.put(0,true);
System.out.print(f(1155));
}
private static boolean f(int n) {
boolean t=false;
if(map.get(n)!=null)return (boolean)map.get(n);//储存重复子问题 节约时间
//如果对手拿到最后一个球则return true
if(n>1&&!f(n-1)) t=true;//我取完一个球 剩下的局面对手认为会输 我就赢了
if(n>3&&!f(n-3)) t=true;
if(n>7&&!f(n-7)) t=true;
if(n>8&&!f(n-8)) t=true;
map.put(n, t);
return t;//底层为false
}
}
思路:
让敌方去思考和判断
这道题用到了动态规划
递归:我取完一个球 剩下的局面对手认为会输 对方拿到最后一个球 我赢
如果对手判断可以赢 那我就必输
重叠子问题:map来存储算过的结果
例如一共三个球 我方输
如果变成四个球 我取一个球 对方剩三个球 刚刚计算过三个球为输 则省去了重复计算