Problem:
Problem D: Deadly Dice Game

T.I. Financial Group, a world-famous group of finance companies, has decided to hold an evil gambling
game in which insolvent debtors compete for special treatment of exemption from their debts.

In this game, each debtor starts from one cell on the stage called the Deadly Ring. The Deadly Ring
consists of N cells and each cell is colored black or red. Each cell is connected to exactly two other
adjacent cells and all the cells form a ring. At the start of the game, each debtor chooses which cell to
start. Then he rolls a die and moves on the ring in clockwise order by cells as many as the number of
spots shown on the upside of the die. This step is called a round, and each debtor repeats a round T times.
A debtor will be exempted from his debt if he is standing on a red cell after he finishes all the rounds.
On the other hand, if he finishes the game at a black cell, he will be sent somewhere else and forced to
devote his entire life to hard labor.

You have happened to take part in this game. As you are allowed to choose the starting cell, you want to
start from a cell that maximizes the probability of finishing the game at a red cell. Fortunately you can
bring a laptop PC to the game stage, so you have decided to write a program that calculates the maximum
winning probability.

Input

The input consists of multiple datasets.

Each dataset consists of two lines. The first line contains two integers N (1 ≤ N ≤ 2000) and T (1 ≤ T ≤ 2000) in this order, delimited with a single space. The second line contains a string of N characters that
consists of characters ‘R’ and ‘B’, which indicate red and black respectively. This string represents the
colors of the cells in clockwise order.

The input is terminated by a line with two zeros. This is not part of any datasets and should not be
processed.

Output

For each dataset, print the maximum probability of finishing the game at a red cell in one line. Your
program may output an arbitrary number of digits after the decimal point, provided that the absolute
error does not exceed 10-8.

Sample Input

6 1
RBRBRB
10 1
RBBBRBBBBB
10 2
RBBBRBBBBB
10 10
RBBBBBBBBB
0 0

Output for the Sample Input

0.50000000
0.33333333
0.22222222
0.10025221

Solution in C++ (judge verdict: Memory Limit Exceeded)

#include<cstdio>
#include<algorithm>

#define	rep(i,n)	for(int i=0;i<n;i++)

using namespace std;

int main(){
	static double dp[2001][12001];
	dp[0][0]=1;
	for(int i=1;i<=2000;i++){
		for(int j=i;j<=6*i;j++){
			for(int k=1;k<=6;k++){
				if(j-k>=0)	dp[i][j]+=dp[i-1][j-k];
			}
			dp[i][j]/=6;
		}
	}

	for(int n,t;scanf("%d%d",&n,&t),n;){
		char ring[2001];	scanf("%s",ring);

		double pr[2000]={};
		for(int i=1;i<=6*t;i++)	pr[i%n]+=dp[t][i];

		double prmax=0;
		rep(d,n){
			double prtmp=0;
			rep(i,n)if(ring[i]=='R'){
				prtmp+=pr[(i+d)%n];
			}
			prmax=max(prmax,prtmp);
		}
		printf("%.9f\n",prmax);
	}

	return 0;
}