• BZOJ.4832.[Lydsy1704月赛]抵制克苏恩(期望DP)


    题目链接

    (f[s][i][j][k])表示还剩(s)次攻击,分别有(i,j,k)个血量为(1,2,3)的奴隶主时,期望受到伤害。
    因为期望是倒推,所以这么表示从后往前求,注意(a,b,c)的更新顺序(全写反了QAQ)!顺推的话需要同时维护概率(概率就是伤害了)。
    注意判断不能超过7。
    命中每个的概率是(i(j,k)/(i+j+k+1)).

    //1124kb	8ms
    #include <cstdio>
    
    double f[53][9][9][9];
    
    void Init()
    {
    //	f[0][A][B][C]=0;
    	for(int i=0; i<50; ++i)
    		for(int a=0; a<=7; ++a)
    			for(int b=0; b<=7-a; ++b)
    				for(int c=0; c<=7-a-b; ++c)
    				{
    					double p=1.0/(a+b+c+1.0);
    					f[i+1][a][b][c]+=/*1.0**/p*(f[i][a][b][c]+1.0);
    					if(a) f[i+1][a][b][c]+=(double)a*p*f[i][a-1][b][c];
    					if(b){
    						if(a+b+c<7) f[i+1][a][b][c]+=(double)b*p*f[i][a+1][b-1][c+1];
    						else f[i+1][a][b][c]+=(double)b*p*f[i][a+1][b-1][c];
    					}
    					if(c){
    						if(a+b+c<7) f[i+1][a][b][c]+=(double)c*p*f[i][a][b+1][c];
    						else f[i+1][a][b][c]+=(double)c*p*f[i][a][b+1][c-1];
    					}
    				}
    }
    
    int main()
    {
    	Init();
    	int A,B,C,K,T; scanf("%d",&T);
    	while(T--)
    		scanf("%d%d%d%d",&K,&A,&B,&C),printf("%.2lf
    ",f[K][A][B][C]);
    	return 0;
    }
    
  • 相关阅读:
    继续致歉
    向大家致歉!!
    访问速度调查
    致歉
    [功能改进]通过Blog客户端直接发随笔至网站分类
    带宽升级公告
    创业团队的类型
    [讨论]基于.NET的开源论坛软件的选择
    调整一下工作的节奏
    公告
  • 原文地址:https://www.cnblogs.com/SovietPower/p/8684445.html
Copyright © 2020-2023  润新知