[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;
}
作者:HSUPPR
出处:http://www.cnblogs.com/hsuppr/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出
原文链接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号