算進 換教室(期望dp)

2022-05-06 21:06:08 字數 1618 閱讀 6669

acwing 題目位址

洛谷 題目位址

特水的一道題,但是聯賽前是半抄題解過的,今天再做一遍。

決策特別明顯:第 i 節課申請換教室或者不申請換教室

根據期望的定義:不申請,則期望消費就是上乙個教室到這乙個教室的路程(如果上一次申請的話,上一次的教室就有兩種可能,就要乘上相應的概率);申請,則期望消費就是上乙個教室到這乙個教室的路程再乘上相應的概率(同理要分別討論上一次是否申請,同理乘上相應概率)(這裡便是這個題目複雜的地方)

我們可以根據決策推導出需要設計的狀態:\(f[i][j][0/1]\) 表示前 \(i\) 次申請了 \(j\) 次,這次否/是選擇申請(0是沒有申請、1是申請了)。

上一次有申請:\(f[i-1][j][1]+g[c_][c_i]*(1-p_)+g[d_][c_i]*p_\)

(\(g[i][j]\) 表示 \(i\) 到 \(j\) 的距離,\(p_i\) 表示第 \(i\) 次申請成功的概率)

\(f[i][j][1]\) 的轉移也是同理的,只是略顯麻煩一點。(要多考慮一層,當前是哪個教室乘上相應概率)

距離的預處理用 \(floyd\)。

值得注意的是,double型別的陣列清空最好不用memset

talk is cheap.show me the code.

#include#define inf 99999999

using namespace std;

inline int read()

while(ch>='0'&&ch<='9')

return x * f;

}const int v_n = 307, n = 2007;

int n,m,v,e;

int g[v_n][v_n];

int c[n],d[n];

double p[n],f[n][n][2];

void floyd()

int main()

floyd();

for(int i=1;i<=n;++i)

for(int j=0;j<=m;++j)

f[i][j][0] = f[i][j][1] = inf;

f[1][0][0] = f[1][1][1] = 0;

for(int i=2;i<=n;++i)

for(int j=0;j<=m;++j)

double ans = inf;

for(int i=0;i<=m;++i)

printf("%.2lf\n",ans);

return 0;

}

double陣列清空這裡不要用memset(f, 0x3f, sizeof(f))!!!而是改用下列**:

for(int i=1;i<=n;++i)

for(int j=0;j<=m;++j)

f[i][j][0] = f[i][j][1] = inf;

兩行淚、兩行淚。

NOIP2016 換教室 期望DP

嗯,noip歷年真題什麼的,到處都有,抓一道就是三四倍經驗題,我就不寫題目描述了23333 偷個懶一定不會被人發現的 事實上,這是我第一次做概率與期望dp的題目,不是很懂套路,然後就想了很久很久,沒什麼太多的頭緒。首先我覺得應該是用f i j 儲存前i個時間段,申請換j次課,期望收穫到的疲勞值。但是...

Noip 2016 換教室 期望DP

期望反映了乙個隨機變數的平均結果,是所有可能結果的概率乘上結果的和。例如對於乙個隨機變數x,1 3機率變為1,1 3機率變為2,1 3機率變為3,則x的期望值為 13 1 1 3 2 13 3 21 3 1 13 2 1 3 3 2期望具有線性性質,我們可以根據加法原理和乘法原理來對期望進行計算 可...

NOIP2016 換教室 期望DP

傳送門 題解 本蒟蒻第一次知道期望是啥意思。很簡單,就是全部概率 價值求和 感覺期望差不多都和dp有關吧 設d p i j 0 1 dp i j 0 1 dp i j 0 1 表示選到第i節課,已經申請了換j節課,其中第i節選 不選的期望。dis用floyd處理一下即可。include includ...