LintCode1300: Bash ゲーム (DP および数学の問題)

1300 · Bash ゲーム
アルゴリズム
簡単

説明
あなたは友達と次のゲームをプレイしています。テーブルの上に石の山があり、毎回、どちらかが交代で 1 ~ 3 個の石を取り除きます。最後の石を取り除いた人が勝者となります。最初のターンで石を取り除きます。

お二人ともとても賢く、ゲームに最適な戦略を持っています。与えられた石の数でゲームに勝つことができるかどうかを判断する関数を作成します。

たとえば、石が 4 つある場合、ゲームに勝つことはできません。1 つ、2 つ、または 3 つの石を削除しても、最後の石は常に友達によって削除されます。


例1:

入力:n = 4
出力:False
説明:1、2、3のいずれかを先に取り、相手は最後のものを取る
例2:

入力:n = 5
出力:True
説明:先に 1 を取れば、ゲームに勝つことができます
Tags
Company
Adob​​e

解決策 1: DP または暗記を使用します。

class Solution {
    
    
public:
    /**
     * @param n: an integer
     * @return: whether you can win the game given the number of stones in the heap
     */
    bool canWinBash(int n) {
    
    
        vector<bool> dp(n + 1, false);
        if (n <= 0) return false;
        if (n <= 3) return true;
        dp[1] = true; dp[2] = true; dp[3] = true;
        for (int i = 4; i <= n; i++) {
    
    
            if (dp[i - 1] == false || 
                dp[i - 2] == false || 
                dp[i - 3] == false) dp[i] = true;
        }
        return dp[n];        
    }
};

上記のメソッドは O(n) であり、明らかに遅すぎます。この問題は数学的に O(1) で解決できます。
1->T 2->T 3->T 4-> F 5->T 6->T 7->T 8-> F 9->T 10->T 11->T 12->F
for 1 , 2、3はどちらもTRUEを返し、4はFALSEを返し、
5が1を選べれば相手が4ならFALSEになるので5はTRUEを返し、6が
2を選べれば相手は4になります。 FALSEになるので6 TRUEが返ってくるなら
7、自分は3を選べば相手は4でFALSEになるので6がTRUEを返すなら8
1、2、3のどれを選んでも、相手が5、6、7の場合はTRUE、8の場合はFALSEが返されるので
、4の倍数であればFALSEを返し、それ以外の場合はTRUEを返すことがわかります。

解決策 2:

class Solution {
    
    
public:
    /**
     * @param n: an integer
     * @return: whether you can win the game given the number of stones in the heap
     */
    bool canWinBash(int n) {
    
    
        //return n % 4 != 0;
        return (n & 0x1) || (n & 0x2);
    }
};

また

class Solution {
    
    
public:
    /**
     * @param n: an integer
     * @return: whether you can win the game given the number of stones in the heap
     */
    bool canWinBash(int n) {
    
    
        return n % 4 != 0;
    }
};

おすすめ

転載: blog.csdn.net/roufoo/article/details/128272151