leetcode 1140ストーンゲームII

質問の意味:

アレックスとリーは自分のゲームの石を続けます。一列に重ね多くの石は、各スタックは、[i]は、正の整数石片山を有しています。誰が勝者を決定するための最も石でゲームを持っています。
アレックスとリーはターン、アレックス最初のスタートを取ります。最初は、M = 1。
各プレイヤーのターンでは、プレイヤーはX、1 <=のX <= 2M前に、石のヒープのすべての残りの部分を奪うことができます。次に、そのようにM = MAX(M、Xは) 。
すべての石が離れて撮影されているまでゲームは続きます。
アレックス・リーの前提と最高レベルのプレーは、アレックスが得ることができる石の最大数を返します。

アイデア:

二人は最高のレベルをプレイしているので、目的は、できるだけ後に自分自身を補うためにある同じポリシーように、あなたはDPで行うことができます。

メモリ検索、DP [i] [j]が各状態に対して、最大M jに開始から採取i番目の時間であり、そして次の状態列挙サフィックスを減算、最大の現在の状態が発見され、dp[i][j]=max(dp[i][j],sum[i]-dp[i+x][max(j,x)]);

コード:

 クラスソリューション{
パブリック:
    INT DP [110] [110]、和[110]。
    INT stoneGameII(ベクトル<整数>&パイル){
        IF(piles.size()== 0)戻り0;
        INT、N = piles.size()。
        以下のために(INT I = N-1、I> = 0; I - )の和[I] =和[I + 1] +杭[I]。
        {(; iがN <I ++はiが0 = INT)のため
            のために(INT J = 1; J <= nであり、j ++){
                IF(I + 2 * J> = N)DP [i] [j]は合計= [私];
            }
        }
        、{ - (I; I> = 0、I = N-1 INT)のための
            ための(INT J = N; J> = 1; J - ){
                int型のx = 1(のために、X <= 2 * J && I + X <N; X ++){
                    DP [I] [J] = MAX(DP [I]、[J]、和[I] -dp [iが+ X] [MAX(J、X)])。
                }
            }
        }
        戻りDP [0] [1]。
    }
}。

おすすめ

転載: www.cnblogs.com/ljy08163268/p/11575207.html