TopCoder SRM 318 Div1 Medium CyclicGame

問題

nマスが円状につながったすごろくがある。
通常の6面ダイスを振って、出た目だけ進んで、止まったマスに書かれた数字の点数を得る。
ゲームは(ダイスを振る前に)好きなタイミングで止めることができる。


最善の戦略を取るとき、ゲームで得られる点数の合計の期待値を求めよ。

制約条件

n≦15
-100≦それぞれのマスに書かれている数字≦100
マスの数字を合計すると負になる

方針

収束するまでループをまわす。
dp[i][j]を、i回サイコロを振ってjのマスにいるときの得点の期待値の最大値とすると、
dp[i+1][j]=max(dp[i][j], Σ(dp[i][j+k]+cells[j+k])/6)


まわす回数は1000回あれば十分。


「止まったら終了するマス」を2^15通り決めて、
それぞれの場合について連立方程式を解いてもとけるらしい。

ソースコード

const int MX=1000;
double dp[MX][20];

class CyclicGame {
	public:
	double estimateBank(vector <int> cells) 
	{
		int n=cells.size();
		memset(dp,0,sizeof(dp));
		
		rep(i,MX-1)rep(j,n){
			double tmp=0;
			rep(k,6)tmp+=(cells[(j+k+1)%n]+dp[i][(j+k+1)%n])/6;
			dp[i+1][j]=max(dp[i][j],tmp);
		}
		return dp[MX-1][0];
	}
	
};