题面

题面

题解

期望\(dp\)好题!

今年\(ZJOI\)有讲过这题...

首先因为\(T\)只有\(50\),大力\(dfs\)后发现,可能的状态数最多只有\(20w\)左右,所以我们就可以大力爆搜了。

设\(dp_i\)为状态为\(i\)时达到目标的期望天数。

则\(dp_i=1+p*dp_{last_i}+(1-p)*\frac{1}{|next_i|}*\sum dp_{next_{i}}\)

其中\(last_{i}\)表示\(i\)删掉\(min\)的状态,\(next_{i}\)表示\(i\)再取一个能量圈的状态。

不难发现这样转移是一棵树。

我们尝试下能否把\(dp_i\)表示成\(kdp_{last_i}+b\)的形式。

先假装这个结论成立,则:\(dp_i=1+p*dp_{last_i}+(1-p)*\frac{1}{|next_i|}*\sum (kdp_i+b)\)

为方便设\(A=(1-p)*\frac{1}{|next_i|}\)

则原式可以表示为:\(dp_i=1+p*dp_{last_i}+A*\sum (kdp_i+b)\)

移项下得:\(dp_i-A*\sum (k*dp_i)=p*dp_{last_i}+A*\sum b\)

把\(dp_i\)的系数化为\(1\),得:\(dp_i=\frac{p}{1-A*\sum k}*dp_{last_i}+\frac{1+A*\sum b}{1-A*\sum k}\)

这样\(dp_i\)就成功的化成了\(k*dp_{last_i}+b\)的形式了。

初始状态不存在\(last_i\),所以\(b\)就是答案。

注意没有能量圈的时候是必定不会损失能量圈的。

还有就是因为我们只关心\(k\)和\(b\)的值,所以在\(dfs\)只要记录\(min\)和总和即可,不必关心具体拥有的能量圈情况是什么,也不必求出\(dp_i\)具体的值。

#include<bits/stdc++.h>
#define For(i,x,y) for (register int i=(x);i<=(y);i++)
#define Dow(i,x,y) for (register int i=(x);i>=(y);i--)
#define cross(i,u) for (register int i=first[u];i;i=last[i])
using namespace std;
typedef long long ll;
inline ll read(){
ll x=0;int ch=getchar(),f=1;
while (!isdigit(ch)&&(ch!='-')&&(ch!=EOF)) ch=getchar();
if (ch=='-'){f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
struct node{
double k,b;
};
int T,n,a[51];
double p;
inline node dfs(int sum,int Min){
if (sum>T) return (node){0,0};
double k=0,b=0;node t;
For(i,1,Min) t=dfs(sum+a[i],i),k+=t.k,b+=t.b;
double P=!sum?0:p,G=(1-P)*(1.0/Min);
return (node){p/(1-G*k),(1+G*b)/(1-G*k)};
}
int main(){
while (~scanf("%lf%d%d",&p,&T,&n)){
For(i,1,n) a[i]=read();
sort(a+1,a+1+n);
printf("%0.3lf\n",dfs(0,n).b);
}
}

Luogu P3251 [JLOI2012]时间流逝 期望dp的更多相关文章

  1. Luogu P1850 换教室(期望dp)

    P1850 换教室 题意 题目描述 对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程. 在可以选择的课程中,有\(2n\)节课程安排在\(n\)个时间段上.在第\(i(1\l ...

  2. luogu 6046 纯粹容器 期望dp

    LINK:纯粹容器 一道比较不错的期望题目. 关键找到计算答案的方法. 容易发现对于每个点单独计算答案会好处理一点. 暴力枚举在第k轮结束统计情况 然后最后除以总方案数即可. 考虑在第k轮的时候结束 ...

  3. luogu P4321 随机漫游 期望dp 二进制 高斯消元

    LINK:随机漫游 非常妙的一道题. 容易想到倒推期望. 设状态 f[i][j]表示到达第i个点 此时已经到达的集合为j能走到全集的期望边数. 只要求出来这个就能O(1)回答询问. \(f[i][j] ...

  4. 【Luogu】P2473奖励关(期望DP)

    题目链接 逆推期望DP.设f[i][j]为1~i-1中吃到的宝物集合为j,在i~k轮能得到的最大期望分数. 如果不吃显然f[i][j]+=f[i+1][j]/n 如果吃就是f[i][j]+=max(f ...

  5. LUOGU P1291 [SHOI2002]百事世界杯之旅 (期望dp)

    传送门 解题思路 期望$dp$.因为这个是期望步数,所以要倒着推.那么这道题就变得一脸可做了,设$f[i]$表示还有$i$张牌没有收集的期望,那么考虑再抽一张,有$(n-i)/n$的概率抽到抽过的牌, ...

  6. luogu P3830 [SHOI2012]随机树 期望 dp

    LINK:随机树 非常经典的期望dp. 考虑第一问:设f[i]表示前i个叶子节点的期望平均深度. 因为期望具有线性性 所以可以由每个叶子节点的期望平均深度得到总体的. \(f[i]=(f[i-1]\c ...

  7. Luogu P1850 [NOIp2016提高组]换教室 | 期望dp

    题目链接 思路: <1>概率与期望期望=情况①的值*情况①的概率+情况②的值*情况②的概率+--+情况n的值*情况n的概率举个例子,抛一个骰子,每一面朝上的概率都是1/6,则这一个骰子落地 ...

  8. 期望$DP$ 方法总结

    期望\(DP\) 方法总结 这个题目太大了,变化也层出不穷,这里只是我的一点心得,不定期更新! 1. 递推式问题 对于无穷进行的操作期望步数问题,一般可用递推式解决. 对于一个问题\(ans[x]\) ...

  9. 概率和期望dp

    概率和期望dp 概率和期望好神啊,完全不会. 网上说概率要顺着推,期望要逆着推,然而我目前做的概率期望题正好都与此相反2333   概率: 关于概率:他非常健康 初中概率题非常恐怖.现在来思考一道题: ...

随机推荐

  1. 新手Python第一天(接触)

    Python 变量 Python的变量由字母,数字,下划线组成不包含特殊字符,不能以数字开头 可以使用的名称 例如:name,name2,my_name 不可使用的名称 例如:if...(Python ...

  2. Streamr助你掌控自己的数据

    博客说明 所有刊发内容均可转载但是需要注明出处. 项目简介 Streamr 致力于为世界实时数据的自由公平交换打造开源平台,并促进全球数据经济的发展.Streamr项目基于区块链技术,并向用户提供数据 ...

  3. sqli-labs学习笔记 DAY8

    DAY 8 sqli-lab Page-3 sqli-labs lesson 38 What is Stacked injection? https://blog.csdn.net/Fly_hps/a ...

  4. jobs命令详解

    基础命令学习目录首页 在用管理员执行一个命令后,用Ctrl+Z把命令转移到了后台.导致无法退出root的. 输入命令:exit终端显示:There are stopped jobs. 解决方法:方法一 ...

  5. 快速删除docker中的容器

    http://blog.csdn.net/cmzsteven/article/details/49230363

  6. iOS 开发学习-类的创建与实现,与java语言的对比

    Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { //在{}中定义属性(全局变量/实例变量 ...

  7. 《找出1到正整数N中出现1的次数》

    <找出1到正整数N中出现1的次数> 编程思想:依次求出正整数每个位数上出现1的次数,累加即可得到最后想要的结果:而每一位上出现1的个数与和它相邻的其它位数上的数字有关系(以此位置上的数为对 ...

  8. Runtime 类的使用

    package com.System.Runtime; import java.io.IOException; /* RunTime 该类类主要代表了应用程序运行的环境. getRuntime() 返 ...

  9. POJ2823(单调队列方法解题)

    因为不太好复制,我就直接截图了,题目链接:题目大致的意思是:给一串数字,然后要你求出每k长度的连续子序列中的最大值以及最小值并输出:这题就是一个最简单的运用单调队列方法解题的例子. 解题思路:通过单调 ...

  10. Java中DAO的实现

    J2EE 开发人员使用数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离.实现 DAO 模式涉及比编写数据访问代码更多的内容.在本文 ...