• HDU-5781 ATM Mechine(概率DP)


    题目大意:某个未知整数x等概率的分布在[0,k]中。每次你都可以从这个整数中减去一个任意整数y,如果x>=y,那么x=x-y,操作次数累计加1;否则,将会受到一次错误提示。当错误提示超过w次,将会对你的人生产生影响。现在,你的任务是将x逐步变为0,求最少操作次数的期望值。
    题目分析:概率DP求期望。定义状态dp(k,w)表示整数分布在[0,k],错误提示次数上限为w时的最少操作次数的期望。
    则dp(k,w)=min(p1*dp(k-y,w)+p2*(y-1,w-1))+1,其中p1、p2分别为k>=y、k<y的概率,p1=(k-y+1)/(k+1)、p2=y/(k+1)。因为你非常聪明,所以你每次都会二分的选择要减掉的整数y。根据题目的数据规模,你最多会操作log2(k)+1次,所以你被错误提示的次数最多log2(k)次。这样,便大大减少了状态数目,使得上述方程能够得以实现。

    参考代码:

    # include<bits/stdc++.h>
    using namespace std;
    
    const int N=2000;
    const double inf=1e9;
    
    double dp[N+5][13];
    
    void init()
    {
    	for(int i=0;i<=12;++i)
    		dp[0][i]=0;
    	for(int i=1;i<=N;++i)
    		for(int j=0;j<=12;++j) dp[i][j]=inf;
    	for(int i=1;i<=N;++i) for(int j=1;j<=12;++j)
    		for(int k=1;k<=i;++k)
    			dp[i][j]=min(dp[i][j],1.0*(i-k+1)/(i+1)*dp[i-k][j]+1.0*k/(i+1)*dp[k-1][j-1]+1.0);
    }
    
    int main()
    {
    	init();
    	int k,w;
    	while(~scanf("%d%d",&k,&w))
    	{
    		w=min(w,12);
    		printf("%.6lf
    ",dp[k][w]);
    	}
    	return 0;
    }
    

      

      

      

  • 相关阅读:
    用户及文件权限管理
    Linux基础操作及概念
    监督学习和非监督学习
    基于仿生算法的智能系统I
    9.Dijkstra求最短路 II 堆优化的Dijkstra
    8.Dijkstra求最短路 I 朴素Dijkstra
    7.有向图的拓扑序列 拓扑排序
    6.树与图的广度优先遍历 图中点的层次
    5.树的重心 树与图的深度优先遍历
    4.八数码 BFS
  • 原文地址:https://www.cnblogs.com/20143605--pcx/p/5743321.html
Copyright © 2020-2023  润新知