链接
https://www.lydsy.com/JudgeOnline/problem.php?id=3191
题解
用
表示我现在算第
个人(主角)活到最后的概率,已经死了
个人,庄主是从
开始数的第
个人(还没抽卡)的概率。
枚举卡,然后算出将要被杀的那个人是
,下一轮的庄主是
,那么
,注意当
时,不转移(因为主角已经死了)。
代码
#include <cstdio>
#include <algorithm>
#define maxn 55
using namespace std;
double f[maxn][maxn][maxn];
int n, m, a[maxn];
void dp()
{
int i, j, k, card, kill;
for(i=1;i<=n;i++)f[i][0][(1-i+n)%n]=1.0;
for(i=1;i<=n;i++)
for(j=0;j<n-1;j++)
for(k=0;k<n-j;k++)
for(card=1;card<=m;card++)
{
kill=(k+a[card]-1+n-j)%(n-j);
if(kill!=0)f[i][j+1][(kill)%(n-j-1)]+=f[i][j][k]/m;
}
for(i=1;i<=n;i++)printf("%.2lf%% ",f[i][n-1][0]*100.00);
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)scanf("%d",a+i);
dp();
return 0;
}