很纠结的概率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; }