質問の意味:
アレックスとリーは自分のゲームの石を続けます。一列に重ね多くの石は、各スタックは、[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]。
}
}。