华南理工大学“三七互娱杯”程序设计竞赛 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]); } }