Luogu P3251 [JLOI2012]时间流逝 期望dp

题面

题面

题解

期望\(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);
    }
}

转载于:https://www.cnblogs.com/zykykyk/p/9454604.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值