[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;

}

 

你可能感兴趣的:(游戏)