[Codeforces 464D]World of Darkraft(期望DP)

[Codeforces 464D]World of Darkraft(期望DP)

题面

游戏中有k种装备,每种装备初始时都是等级1。zyd每打一只怪,就会随机爆出一件装备。掉落和更新装备方式如下:

假设这种装备当前等级为t,那么系统会在[1,t+1]中等概率随机出该装备的等级。爆出装备后,会装备上身上的和爆出的装备之间等级更高的那件,并卖掉等级更低的装备。其中等级为i的装备价格为i金币。

求打了n只怪后获得金币的期望值,精确到\(10^{-9}\)。

\(n,k\leq 10^5\)

分析

首先,所有装备没有区别。根据期望的线性性可以计算出买某种装备的期望收益,再乘上\(k\)

设\(dp[i][j]\)表示某种装备现在\(j\)级,再打\(i\)只怪后的期望收益

考虑从\(i-1\)推到\(i\)(注意:这实际上是倒推),分情况讨论:

  1. 爆出的不是这种装备,概率\(\frac{k-1}{k}\),期望\(\frac{k-1}{k}dp[i-1][j]\)
  2. 爆出的是这种装备,概率\(\frac{1}{k}\)
    2.1 爆出的装备等级为\(j+1\),概率为\(\frac{1}{j+1}\),此时把当前装备卖掉获得\(j\)金币。那么倒推期望,从\(dp[i-1][j+1]\)转移过来,期望\(\frac{j+dp[i-1][j+1]}{j+1}\)

    2.2爆出的装备等级为\([1,j]\)中的一个,概率\(\frac{j}{j+1}\).卖掉这个装备,由于概率均匀分布,获得金币的期望值为\(\frac{j+1}{2}\)。此后手上装备等级还是\(j\),从\(dp[i-1][j]\)转移,期望\(\frac{j}{j+1}(dp[i-1][j]+\frac{j+1}{2})\)

那么我们可以写出最终的dp方程

\(dp[i][j]=\frac{k-1}{k}dp[i-1][j]+\frac{1}{k}(\frac{j+dp[i-1][j+1]}{j+1}+\frac{j}{j+1}(dp[i-1][j]+\frac{j+1}{2}))\)

这样的转移是\(O(n^2)\)的.想到期望dp的一般套路,j过大的时候期望值小到可以忽略不计。经过测试j枚举到700即可。严谨的证明请参考cf官方题解

代码

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#define maxb 700
using namespace std;
typedef double db;
int n;
db k;
db dp[2][maxb+5];
int main(){
    scanf("%d %lf",&n,&k);
    int now=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=maxb;j++){
            dp[now][j]=dp[now^1][j]*(k-1.0)/db(k)
                       +((dp[now^1][j+1]+j)/(j+1.0)
                       +(dp[now^1][j]+(j+1)/2.0)*j/(j+1.0))/db(k);
        }
        now^=1;
    }
    printf("%.10lf\n",k*dp[now^1][1]);
}
                

原文地址:https://www.cnblogs.com/birchtree/p/12266236.html

时间: 2024-07-30 10:50:17

[Codeforces 464D]World of Darkraft(期望DP)的相关文章

[Codeforces Round #146 (Div. 1) B]Let&#39;s Play Osu!(期望Dp)

Description You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. For each click there are two outcomes: correct or bad. Let us denote correct as "O", bad as "X", then the whole play can be

Codeforces - 1264C - Beautiful Mirrors with queries - 概率期望dp

一道挺难的概率期望dp,花了很长时间才学会div2的E怎么做,但这道题是另一种设法. https://codeforces.com/contest/1264/problem/C 要设为 \(dp_i\) 表示第 \(i\) 个格子期望经过多少次,所以 \(dp_{n+1}=1\). https://www.cnblogs.com/suncongbo/p/11996219.html 原文地址:https://www.cnblogs.com/KisekiPurin2019/p/12063633.ht

Codeforces 908 D.New Year and Arbitrary Arrangement (概率&amp;期望DP)

题目链接:New Year and Arbitrary Arrangement 题意: 有一个ab字符串,初始为空. 用Pa/(Pa+Pb)的概率在末尾添加字母a,有 Pb/(Pa+Pb)的概率在末尾添加字母b,当出现≥k个ab子串时立即停止添加字母,求最后期望的ab子串个数.(子串ab不要求连续) 例子:当k=1,aab含2个ab,bbabbab时不可能出现的,因为到了bbab就会停止添加字母. 题解: 期望DP DP果然是智商的分界线 orz @.@#,这题题意其实我也没看太懂,后来看了别人

CodeForces 540D Bad Luck Island 概率dp

CodeForces 540D 应该是简单概率dp,由于写得少显得十分蠢萌 求期望逆推,求概率正推,大概是这么个意思,贴一发留恋 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define db double const int maxn=108; db dp[maxn][maxn][maxn]; int main() { int i,j,n,m,k,p; whi

cf 398B. Painting The Wall【期望dp】

传送门:http://codeforces.com/problemset/problem/398/B Description: User ainta decided to paint a wall. The wall consists of n2 tiles, that are arranged in an n?×?n table. Some tiles are painted, and the others are not. As he wants to paint it beautifull

Codeforces.280C.Game on Tree(期望)

题目链接 参考:浅谈期望的线性性(可加性) Codeforces 280C Game on Tree 概率dp 树上随机删子树 求删完次数的期望(这个的前半部分分析并没有看..) \(Description\) 给你一棵有\(n\)个白点的有根树,每次随机选择一个点,将它和它的子树中所有点染黑. 问期望操作多少次后所有点都被染黑? \(Solution\) 期望好玄啊..(好吧是我太弱) 因为概率具有可加性,一棵树可以分解为多棵子树,而子树分解的最终状态就是点,所以我们可以计算每个点的期望操作次

【bzoj4872】[Shoi2017]分手是祝愿 数论+期望dp

题目描述 Zeit und Raum trennen dich und mich. 时空将你我分开. B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这个灯是灭的,游戏的目标是使所有灯都灭掉.但是当操作第 i 个开关时,所有编号为 i 的约数(包括 1 和 i)的灯的状态都会被改变,即从亮变成灭,或者是从灭变成亮.B 君发现这个游戏很难,于是想到了这样的一个

HDOJ 1145 So you want to be a 2n-aire? 期望DP

期望DP So you want to be a 2n-aire? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 267    Accepted Submission(s): 197 Problem Description The player starts with a prize of $1, and is asked a seq

HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由于得到每张卡片的状态不知道,所以用状态压缩,dp[i] 表示这个状态时,要全部收齐卡片的期望. 由于有可能是什么也没有,所以我们要特殊判断一下.然后就和剩下的就简单了. 另一个方法就是状态压缩+容斥,同样每个状态表示收集的状态,由于每张卡都是独立,所以,每个卡片的期望就是1.0/p,然后要做的就是要去重,既然