【期望Dp】【bzoj1426】: 收集郵票
Description
有n種不同的郵票,皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那裡購買,每次只能買一張,並且買到的郵票究竟是n種郵票中的哪一種是等概率的,概率均為1/n。但是由於凡凡也很喜歡郵票,所以皮皮購買第k張郵票需要支付k元錢。 現在皮皮手中沒有郵票,皮皮想知道自己得到所有種類的郵票需要花費的錢數目的期望。
Input
一行,一個數字N N<=10000
Output
要付出多少錢. 保留二位小數
Sample Input
3
Sample Output
21.25
思路
f[i]代表已經擁有了i張郵票,還需購買郵票次數的期望。顯然f[n]=0。
那麼對於已經擁有i張郵票的狀態,下一次選擇有兩種情況:
①有i/n的概率取重複的郵票,狀態依舊為f[i],②有(n-i)/n的概率取其它的郵票,狀態進入f[i+1]
那麼我們就能得到方程f[i]=(i/n)∗f[i]+((n−i)/n)∗f[i+1]+1
整理得f[i]=f[i+1]+n/(n−i)
我們令g[i]代表已經擁有i張郵票,還需花的錢的數量。同理g[n]=0。
對於g[i]也同樣有兩種情況。已知每次取郵票花的錢比上一次多一,反過來計算,假設取第k張郵票花1元,k之前的每次比後一次多1。
那麼就有方程g[i]=((n−i)/n)∗(g[i+1]+f[i+1])+(i/n)∗(g[i]+f[i])+1
整理得g[i]=((i/n)∗f[i]+((n−i)/n)∗(g[i+1]∗f[i+1]))∗(n/(n−i))
g[0]即為所求
神奇的程式碼
#include <bits/stdc++.h>
using namespace std;
double f[10005],g[10005];
int n;
int main(){
scanf("%d",&n);
for(int i=n-1;i>=0;--i) f[i]=f[i+1]+1.0*n/(n-i);
for(int i=n-1;i>=0;--i) g[i]=(f[i]*i/n+(g[i+1]+f[i+1])*(n-i)/n+1)*n/(n-i);
printf("%.2lf",g[0]);
return 0;
}
相關推薦
BZOJ1415 || 洛谷P4206 [NOI2005]聰聰與可可【期望DP&&記憶化搜尋】
Time Limit: 10 Sec Memory Limit: 162 MB Description Input 資料的第1行為兩個整數N和E,以空格分隔,分別表示森林中的景點數和連線相鄰景點的路的條數。 第2行包含兩個整數C和M,以空格分隔,分別表示初始
【期望Dp】【bzoj1426】: 收集郵票
題目的連結 Description 有n種不同的郵票,皮皮想收集所有種類的郵票。唯一的收集方法是到同學凡凡那裡購買,每次只能買一張,並且買到的郵票究竟是n種郵票中的哪一種是等概率的,概率均為1/n。但是由於凡凡也很喜歡郵票,所以皮皮購買第k張郵票需要支付
bzoj 1426: 收集郵票【期望dp】
std turn 期望 const log n) -i str amp 我太菜了,看的hzwer的blog才懂 大概是設f[i]表示已經擁有了i張郵票後期望還要買的郵票數,這個轉移比較簡單是f[i]=f[i](i/n)+f[i+1]((n-i)/n)+1 然後設g[i]為還
hdu4418 Time travel 【期望dp + 高斯消元】
mes char print puts || algo har return ssi 題目鏈接 BZOJ4418 題解 題意:從一個序列上某一點開始沿一個方向走,走到頭返回,每次走的步長各有概率,問走到一點的期望步數,或者無解 我們先將序列倍長形成循環序列,\(n =
HDU4624 Endless Spin 【最大最小反演】【期望DP】
its eof 期望dp bre \n include ace -s while 題目分析: 題目是求$E(MAX_{i=1}^n(ai))$, 它等於$E(\sum_{s \subset S}{(-1)^{|s|-1}*min(s))} = \sum_{s \subset
bzoj 4720: [Noip2016]換教室【期望dp】
zoj can 期望dp getchar [1] using main urn || 狀壓dp,設f[i][j][0/1]為前i個時間段換了j間教室的期望體力消耗,轉移很好想(但是寫起來好長= =) #include<iostream> #include<
bzoj 1415: [Noi2005]聰聰和可可【期望dp+bfs】
noi2005 bool oid etc 9.png tdi += ems std 因為邊權為1所以a直接bfs瞎搞就行……我一開始竟然寫了個spfa #include<iostream> #include<cstdio> #include<
BZOJ 3036 綠豆蛙的歸宿【拓撲排序】【期望DP】
直接反圖+拓排然後跑一遍概率DP #include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #inclu
洛谷P4316 綠豆蛙的歸宿【期望DP】
時空限制 1000ms / 128MB 題目描述 給出一個有向無環圖,起點為1終點為N,每條邊都有一個長度,並且從起點出發能夠到達所有的點,所有的點也都能夠到達終點。綠豆蛙從起點出發,走向終點。 到達每一個頂點時,如果有K條離開該點的道路,綠豆蛙可以選擇任意一條
BZOJ 1419 Red is good【期望DP】
f[i][j]f[i][j]f[i][j]表示選了iii張紅牌,jjj張黑牌的最優期望得分。 那麼接下來,有ii+j\frac{i}{i+j}i+ji的可能+1分,有ji+j\frac{j}{i+j}i+jj的可能-1分,所以不難寫出狀態轉移方程: f[i]
LIghtOJ1038---Race to 1 Again【期望dp】
題意:一個整數n每次除以他的因子求除以到1時的期望次數。 t=10000,100000>=n>=1肯定要打表的。 dp【50】=(dp【1】+dp【2】+dp【5】+dp【10】+dp【25】+dp【50】)/6+1。1是貢獻的次數1。 按這個方程打表即可。
LightOJ 1038 Race to 1 Again 【期望dp】
思路: 首先要知道一個期望公式:E3 = (E1+1)/3 + (E2 + 1)/3 + (E3 +1)/3 ; 這個公式中的E3要根據題意來判斷是否加入;比如這題求的是一個數被除的情況是有自己除自己的,所以總的期望還要包含自己本身的期望;又如求一個人的移動期望,如果存
BZOJ 1076 [SCOI2008]獎勵關【狀態壓縮】【期望DP】
基於hzwer的部落格。 lim[i]lim[i]lim[i]表示可以獲得iii得前提。 考慮倒推,當前狀態的期望=(上一個狀態的期望+這次得到的價值)/概率 #include <bits/stdc++.h> #define db double #d
【期望dp】Lightoj 1027 A Dangerous Maze
一道很好的概率期望題目,沒用到dp不過,再次理解了統計平均(期望E) /* light_oj 1027 期望DP 並沒有什麼遞推 題意: n個傳送門,m個可以逃離,其他的 求解:
BJ模擬 隨機遊走【期望dp+倍增】
題目描述 給定一棵n個節點的樹,一個人在樹上隨機遊走,即從一個點等概率走到相鄰的一個點,m組詢問,問從x走到y的期望。 n≤100000n≤100000 解題思路: 樹上概率期望一般設兩個值,一個從自己到父親,一個從父親到自己。 設fifi表示從ii走
【期望dp】綿羊跳彈簧
esp oid c++ eof color stdout 下一個 ems tro 【期望dp】 綿羊跳彈簧 >>>>題目 【題目】 T 組數據。對於每一組數據,有n+1 個格子從0 到n 標號,綿羊從0 號結點開始,每次若在 x 位置擲骰子,令擲出的
UVa 825【簡單dp,遞推】
space 遞推 log 題目 logs .org str eof scan UVa 825 題意:給定一個網格圖(街道圖),其中有一些交叉路口點不能走。問從西北角走到東南角最短走法有多少種。(好像沒看到給數據範圍。、。) 簡單的遞推吧,當然也就是最簡單的動歸了。顯然最短路
【貪心/DP/單調隊列】【CF1029B】Creating the Contest
swap cout const output i+1 隊列 octopus 描述 ++i Description 給你一個單調不下降的長度為n的序列,請你找出一個最長的子序列,滿足找出的子序列中,\(A_i<=A_{i-1}~\times~2\),其中i為下標,A為找
nssl1270-創世紀【樹形dp,基環樹】
正題 題目大意 每個物品有一個可以限制的物品,要求一個集合內所有的物品都有一個不在集合內物品限制。求這個集合可以保護的最多物品 解題思路 類似沒有上司的舞會 其實就是在基環樹森林,我們可以利用二次樹形dp的方法。 先找到環,然後強行將環斷開進行一次dp,然後強
【概率DP+矩陣快速冪】 POJ - 3744 Scout YYF I
Scout YYF I POJ - 3744 YYF is a couragous scout. Now he is on a dangerous mission which is to penetrate into the enemy's base. Afte