bzoj3191: [JLOI2013]卡牌游戏

链接

https://www.lydsy.com/JudgeOnline/problem.php?id=3191

题解

f [ i ] [ j ] [ k ] 表示我现在算第 i 个人(主角)活到最后的概率,已经死了 j 个人,庄主是从 i 开始数的第 k 个人(还没抽卡)的概率。
枚举卡,然后算出将要被杀的那个人是 k i l l = ( k + a [ c a r d ] 1 ) mod ( n j ) ,下一轮的庄主是 n e x t = ( k i l l + 1 ) mod ( n j 1 ) ,那么 f [ i ] [ j + 1 ] [ n e x t ] + = f [ i ] [ j ] [ k ] ,注意当 k i l l = j 时,不转移(因为主角已经死了)。

代码

#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;
}

猜你喜欢

转载自blog.csdn.net/fsahfgsadhsakndas/article/details/80932663