华南理工大学“三七互娱杯”程序设计竞赛 HRY and codefire(概率期望DP)

https://ac.nowcoder.com/acm/contest/874/A

题目:有两个账号 , 一开始都为0级 , 求任意一个账号升级到N的期望

要求:如果当前账号嬴了 , 就继续沿用当前的账号,否则就更换其他账号,第i级嬴的概率是pi;

 官方题解

 

因为dp[i][j] 涉及到 dp[j][i] 的价值 ,如果单纯的只是用一条式子是无法得出dp[i][j]的价值 , 应为这是从后开始计算的 , dp[j][i]还没有被计算到 ,所以必须需要两条方程 , 单纯的两条也是不行 , 因为dp[i][j]  所需要的dp[j][i] 在后面才计算出来 所以这样是不行的 , 那就需要联立方程了

#include<bits/stdc++.h>
using namespace std;
double dp[400][400],p[400];
int main()
{
    int T;scanf("%d",&T);
    while(T--)
    {
        int n;scanf("%d",&n);
        memset(dp,0,sizeof(dp));
        for(int i=1 ; i<=n ; i++)
        {
            scanf("%lf",&p[i]);
        }
        for(int i=n ; i>=1 ; i--)
        {
            for(int j=n ; j>=1 ; j--)
            {
                dp[i][j]=(p[i]*dp[i+1][j]+(1-p[i])*p[j]*dp[j+1][i]+1-p[i]+1)/(1-(1-p[i])*(1-p[j]));
                dp[j][i]=(p[j]*dp[j+1][i]+(1-p[j])*p[i]*dp[i+1][j]+1-p[j]+1)/(1-(1-p[j])*(1-p[i]));

            }
        }
        printf("%.4f\n",dp[1][1]);
    }

}
View Code

 

posted @ 2019-04-29 20:24  shuai_hui  阅读(194)  评论(0编辑  收藏  举报