[JLOI2013]卡牌游戏

很纠结的概率dp。我太菜了,考场没做出来 - -|

f[i][j] 代表 还剩i个人,庄家是j的概率。(这个j是j被踢出后,后边的j + 1移动过来的)

因为有一个人要留下来,所以他不能被踢出。

轮换一下编号就好做了一些。(把应该留下来的人轮换成0)

所以就是f[i][0] = f[i][i];(0不可以被踢出,貌似说过了...)

/**
 * Problem:JLOI2013-game
 * Author:Shun Yao
 * Time:2013.5.20
 * Result:Accepted
 * Memo:DP
 */

#include <cstring>
#include <cstdlib>
#include <cstdio>

using namespace std;

long n, m, a[55];
double f[55][55];

int main() {
	static long i, j, k, l;
	freopen("game.in", "r", stdin);
	freopen("game.out", "w", stdout);
	scanf("%ld%ld", &n, &m);
	for (i = 0; i < m; ++i) {
		scanf("%ld", a + i);
		--a[i];
	}
	for (l = 0; l < n; ++l) {
		memset(f[n], 0, sizeof f[n]);
		f[n][(n - l) % n] = 1.0;
		for (i = n - 1; i > 0; --i) {
			memset(f[i], 0, sizeof f[i]);
			for (j = 0; j <= i; ++j)
				for (k = 0; k < m; ++k)
					f[i][(j + a[k]) % (i + 1)] += f[i + 1][j] / m;
			f[i][0] = f[i][i];
		}
		if (l)
			putchar(' ');
		printf("%.2lf%%", f[1][0] * 100);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}

 

posted @ 2013-05-20 19:59  hsuppr  阅读(285)  评论(0编辑  收藏  举报