2017-11-09 4 views
0

この次の質問に出くわしました。プレイヤー1が2人のプレイヤーのゲームで勝てる方法の数

2人のプレイヤーがプレイしています。各ターンにおいて、両方のプレイヤーは-xから+ xの範囲内のポイントを受け取る(両方とも含まれる)。プレーヤー1はスコアp1から開始し、プレーヤー2はスコアp2から開始します。彼らが合計kターンをプレイした場合、プレイヤー1がゲームに勝つことができる方法の総数、すなわちkターンの終わりにプレイヤー1がプレイヤー2よりも多くのポイントを持つことを見つける。

プレイヤー1とプレイヤー2の組み合わせポイントの総数を求める必要があること(プレイヤー1のポイントの合計) - (プレイヤー2のセットポイントの合計)> = p2-p1 + 1

私はこの問題にどのように対処するか分かりません。アプローチを提案してください。前もって感謝します。

答えて

1

これを再帰的に解決します。あなたの変数を使って、ケースを見てみましょう:。

score_range = [-x : x] 

コール機能win_count

ベースケース、K == 1

k == 1場合は、行くには1つのターンがあるしましょう。スコアの差はp2-p1です。このラウンドでプレーヤー2の得点がn2の場合、プレーヤー1はこのラウンドで少なくとも(p2 + n2) - p1 + 1ポイントで終了する必要があります。さて、p1, p2 in score_rangeで利用可能な組み合わせはいくつありますか?与えられた整数から直接計算することができます。

その数を関数値として返します。

再帰場合、このラウンドのための可能なスコアの全てを介してK> 1

ウォーク。残りのゲームの可能性を数えるために繰り返します。

count = 0 
for n1 in score_range 
    for n2 in score_range 
     count += win_count(p1+n1, p2+n2, k-1, x) 

あなたはそこから取ることができますか?

+0

この権利のためのdp定式化が必要ですか?たとえば、-xから+ xの代わりに、範囲として0から2xを使用することもできますが、最終的な答えは同じでなければなりません。私は確かにどのような状態を考慮する必要があるか分からない。 3次元配列、ラウンドの1次元、プレイヤー1とプレイヤー2のスコアのそれぞれ1つですか? – user2980096

+1

良い仕事 - もちろん、DPの改善があります。あなた自身のものを作ることを気にしないでください。 '@ memoize'デコレータを使用してください(あなたはパッケージを調べることができます)。関数には4つのパラメータがありますが、1つは定数なので、memoizationのための3つのアクティブなキー 'p1、p2、k'があります。 – Prune

+0

あなたのソリューションにはありがとうございます! – user2980096

関連する問題