1300 · Bash ゲーム
アルゴリズム
簡単
説明
あなたは友達と次のゲームをプレイしています。テーブルの上に石の山があり、毎回、どちらかが交代で 1 ~ 3 個の石を取り除きます。最後の石を取り除いた人が勝者となります。最初のターンで石を取り除きます。
お二人ともとても賢く、ゲームに最適な戦略を持っています。与えられた石の数でゲームに勝つことができるかどうかを判断する関数を作成します。
たとえば、石が 4 つある場合、ゲームに勝つことはできません。1 つ、2 つ、または 3 つの石を削除しても、最後の石は常に友達によって削除されます。
例
例1:
入力:n = 4
出力:False
説明:1、2、3のいずれかを先に取り、相手は最後のものを取る
例2:
入力:n = 5
出力:True
説明:先に 1 を取れば、ゲームに勝つことができます
Tags
Company
Adobe
解決策 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;
}
};