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...