动态规划一-博弈类

292. Nim Game

You are playing the following Nim Game with your friend:

  • Initially, there is a heap of stones on the table.
  • You and your friend will alternate taking turns, and you go first.
  • On each turn, the person whose turn it is will remove 1 to 3 stones from the heap.
  • The one who removes the last stone is the winner.

Given n, the number of stones in the heap, return true if you can win the game assuming both you and your friend play optimally, otherwise return false

Example 1:

Input: n = 4
Output: false
Explanation: These are the possible outcomes:
1. You remove 1 stone. Your friend removes 3 stones, including the last stone. Your friend wins.
2. You remove 2 stones. Your friend removes 2 stones, including the last stone. Your friend wins.
3. You remove 3 stones. Your friend removes the last stone. Your friend wins.
In all outcomes, your friend wins.

Example 2:

Input: n = 1
Output: true

Example 3:

Input: n = 2
Output: true

Constraints:

  • 1 <= n <= 231 - 1
class Solution {
    public boolean canWinNim(int n) {
        Boolean[] status = new Boolean[n+1];
        return helper(n,status);
    }
    private boolean helper(int n,Boolean[] status){
        if(n<=0) return false;//如果没有剩余的石头了,那么我就输了
        if(status[n]!=null) return status[n];
        for(int i=1;i<4;i++){//我可以取1,2,3个石头
            if(!helper(n-i,status)) return true; //如果我拿i个,剩下的如果对手能赢(true),那我就输了,对手输了(false) 我就能赢
        }
        return status[n]=false;
    }
}

 

上一篇:summary for ip


下一篇:接口隔离原则 (ISP:Interface Segregation Principle)