zoukankan      html  css  js  c++  java
  • ●BZOJ 4008 [HNOI2015]亚瑟王

    题链:

    http://www.lydsy.com/JudgeOnline/problem.php?id=4008
    题解:

    概率dp,神仙题
    如果我们可以求出每种牌被取到的概率f,那么最后期望造成的伤害也就很好计算了。
    定义dp[i][j]表示有j轮游戏在1~i中的某张牌处就结束的概率。
    那么此时我们考虑dp[i][j]会怎样对f[i+1]造成贡献:
    只剩下了R-j轮游戏进行到了第i+1张牌,怎么计算这种情况下第i+1张牌发动技能的概率g呢?
    (令p为其发动技能的概率,并给这R-j轮游戏重新依次编号为1,2,……,R-j)
    显然有:g=p+(1-p)*p+(1-p)^2*p+p……+(1-p)^(R-j-1)*p
    上式表示重新编号后的在第1轮发动技能的概率+在第2轮发动技能的概率+……+在第R-j轮发动技能的概率。
    然而不需要这么麻烦的计算,因为上面的g=1-(1-p)^(R-j),(自己YY为什么是对的吧)
    然后把对f[i+1]进行贡献:f[i+1]+=dp[i][j]*g

    接下来考虑如何转移dp[i][j]:
    1.这R-j轮可以进行到第i+1张牌的机会都没有让其发动技能:
    dp[i+1][j]+=dp[i][j]*(1-p)^(R-j)
    2.这R-j轮可以进行到第i+1张牌的机会让其发动了一次技能:
    dp[i+1][j+1]+=dp[i][j]*(1-(1-p)^(R-j))

    然后就是不断转移dp的同时去求出f[]数组。

    (真的是神仙题,题解都看了好久,好像第一次遇到这种定义了一个莫名其妙的dp状态去辅助求出另外一个东西从而得出答案的题。。。)


    代码:

    #include<bits/stdc++.h>
    using namespace std;
    double dp[250][150],p[250],f[250],ans;
    int d[250];
    int N,R,Case;
    double fastpow(double a,int b){
    	double ret=1;
    	for(;b;a=a*a,b>>=1)
    		if(b&1) ret*=a;
    	return ret;
    }
    int main(){
    	for(scanf("%d",&Case);Case;Case--){
    		scanf("%d%d",&N,&R);
    		for(int i=1;i<=N;i++) scanf("%lf%d",&p[i],&d[i]),f[i]=0;
    		for(int i=0;i<=N;i++) for(int j=0;j<=R;j++) dp[i][j]=0;
    		dp[0][0]=1; ans=0;
    		for(int i=0;i<N;i++)
    			for(int j=0;j<=R;j++){
    				double k=fastpow(1-p[i+1],R-j);
    				dp[i+1][j]+=dp[i][j]*k;
    				if(j+1<=R){
    					dp[i+1][j+1]+=dp[i][j]*(1-k);
    					f[i+1]+=dp[i][j]*(1-k);
    				}
    			}
    		for(int i=1;i<=N;i++) ans+=f[i]*d[i];
    		printf("%.10lf
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/zj75211/p/8541968.html
Copyright © 2011-2022 走看看