码迷,mamicode.com
首页 > 其他好文 > 详细

51nod 1450 闯关游戏——期望dp

时间:2018-09-13 01:15:40      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:题解   cst   return   分叉   div   搜索   getch   验证   data   

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

想了半天,不知道不能走的状态(即最后不足m个的状态)怎么办。去吃晚饭的路上想到那种也是转移到 f[ i ][ j ] 自己,因为意义是需要再来一次,状态没有前进。

想出那个之前稍微看了点题解,不过只看到需要按 y 排序。若非此自己可能还想不到要排序。还对拍验证了一下,确实有差异。

把 y 大的排在前面,x 值大是第二关键字。之所以排在前面,是因为前面的影响更大(即使是倒着推的),就想搜索的时候把分叉少的排在前面一样。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define db double
using namespace std;
const int N=2005; const db INF=0x3f3f3f3f;
int n,m;
db f[N][N<<1];
struct Node{
  db x,y,z;
}a[N];
bool cmp(Node u,Node v){return u.y==v.y?u.x<v.x:u.y<v.y;}
int rdn()
{
  int ret=0,fx=1; char ch=getchar();
  while(ch>9||ch<0){ if(ch==-) fx=-1; ch=getchar();}
  while(ch>=0&&ch<=9) ret=(ret<<3)+(ret<<1)+ch-0,ch=getchar();
  return ret;
}
int main()
{
  //  freopen("51nod1450-data.in","r",stdin);
  //  freopen("51nod1450-bl.out","w",stdout);
  n=rdn(); m=rdn();
  for(int i=1;i<=n;i++)
    a[i].x=(db)rdn()/1000,a[i].y=(db)rdn()/1000,a[i].z=1-a[i].x-a[i].y;
  sort(a+1,a+n+1,cmp);
  for(int i=0;i<m;i++) f[n+1][i]=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,d=(i<<1);j<=d;j++)
      {
    //    printf("i=%d j=%d\n",i,j);
    //    printf("f[i+1][j+1]=%.8lf f[i+1][j+2]=%.8lf\n",f[i+1][j+1],f[i+1][j+2]);
    if(f[i+1][j+1]==INF)
      {
        if(f[i+1][j+2]==INF)
          f[i][j]=INF;
        else f[i][j]=(a[i].y*f[i+1][j+2]+1)/(1-a[i].x-a[i].z);
      }
    else f[i][j]=(a[i].x*f[i+1][j+1]+a[i].y*f[i+1][j+2]+1)/(1-a[i].z);
    //    printf("f[%d][%d]=%.8lf\n",i,j,f[i][j]);
      }
  printf("%.8lf\n",f[1][0]);
  return 0;
}

 

51nod 1450 闯关游戏——期望dp

标签:题解   cst   return   分叉   div   搜索   getch   验证   data   

原文地址:https://www.cnblogs.com/Narh/p/9638225.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!