superoj754 游戏

来源:互联网 发布:c语言是干什么的 编辑:程序博客网 时间:2024/06/16 07:54

题目描述

输入格式

一个正整数 n ,含义如题目所述。

输出格式

一个数,表示 Alice 获胜的概率,保留 6 位小数。

样例数据 1

输入  [复制]

1

输出

0.666667

备注

【数据范围】
对于 30% 的数据,n≤10
对于 100% 的数据,n≤500

分析:

     概率dp,倒着做,由结果推初始值


代码:

#include<string>#include<cstring>#include<cmath>#include<cstdio>#include<cstdlib>#include<iostream>#include<algorithm>#include<queue>#include<vector>using namespace std;double f[2000][2000];int n;int read(){int k=0,f=1;char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();}while(c>='0'&&c<='9') {k=k*10+c-'0'; c=getchar();}return k*f;}int main(){//freopen("game.in","r",stdin);//freopen("game.out","w",stdout); n=read();    int i,j,k;    for(i=0;i<=n;i++)      {      f[n][i]=1;  }for(i=0;i<n;i++)    f[i][n]=0;for(i=n-1;i>=0;i--)  for(j=n-1;j>=0;j--)    {        for(k=1;k<=10;k++){int he=1<<(k-1);int l=i+he;if(l>n)l=n;double dd=1.0/(he*2);f[i][j]=max(f[i][j],((0.5*dd*f[l][j]+0.5*dd*f[l][j+1]+(0.5-0.5*dd)*f[i][j+1])/(0.5+0.5*dd)));}  }printf("%0.6f",f[0][0]);return 0;}


0 0