zoukankan      html  css  js  c++  java
  • 51Nod 1450 闯关游戏 —— 期望DP

    题目:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1450

    期望DP;

    INF 表示这种情况不行,转移时把不行的概率也转移到自身即可;

    还要按得星概率排个序,先决策概率大的就是最优策略,因为后面的都基于它。

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int const maxn=2005,inf=1e9;
    int n,m;
    double f[maxn][maxn<<1];
    struct N{double p1,p2,p0;}a[maxn];
    bool cmp(N x,N y){return x.p2==y.p2?x.p1<y.p1:x.p2<y.p2;}
    int main()
    {
      scanf("%d%d",&n,&m);
      for(int i=1,x,y;i<=n;i++)
        {
          scanf("%d%d",&x,&y);
          a[i].p0=1.0*(1000-x-y)*0.001;
          a[i].p1=1.0*x*0.001;
          a[i].p2=1.0*y*0.001;
        }
      sort(a+1,a+n+1,cmp);
      for(int j=0;j<m;j++)f[n+1][j]=inf;
      for(int i=m,d=((n+1)<<1);i<=d;i++) f[n+1][i]=0;
      for(int i=n;i;i--)
          for(int j=0;j<=2*i;j++)
        {
          double k=1-a[i].p0;
          if(f[i+1][j+1]==inf&&f[i+1][j+2]==inf)f[i][j]=inf;
          else if(f[i+1][j+1]==inf)k=k-a[i].p1,f[i][j]=(f[i+1][j+2]*a[i].p2+1)/k;
          // else if(f[i+1][j+2]==inf)k=k-p[2][i],f[i][j]=(f[i+1][j+1]*p[1][i]+1)/k;//不会有 f[i+1][j+1]!=inf 而 f[i+1][j+2]=inf 的情况
          else f[i][j]=(f[i+1][j+1]*a[i].p1+f[i+1][j+2]*a[i].p2+1)/k;
        }
      printf("%.8lf
    ",f[1][0]);
      return 0;
    }
  • 相关阅读:
    python注释中文
    python学习好文
    浅析python 的import 模块(转)
    Python解释器镜像源修改
    Python解释器安装
    Python和Python解释器
    计算机基础小结
    网络瓶颈效应
    编程语言分类
    子查询|视图事务
  • 原文地址:https://www.cnblogs.com/Zinn/p/9643681.html
Copyright © 2011-2022 走看看