對於剛上大學的牛牛來說,他面臨的第乙個問題是如何根據實際情況申請合適的課程。
在可以選擇的課程中,有 \(2n\) 節課程安排在 \(n\) 個時間段上。在第 \(i\)(\(1 \leq i \leq n\))個時間段上,兩節內容相同的課程同時在不同的地點進行,其中,牛牛預先被安排在教室 \(c_i\) 上課,而另一節課程在教室 \(d_i\) 進行。
在不提交任何申請的情況下,學生們需要按時間段的順序依次完成所有的 \(n\) 節安排好的課程。如果學生想更換第 \(i\) 節課程的教室,則需要提出申請。若申請通過,學生就可以在第 \(i\) 個時間段去教室 \(d_i\) 上課,否則仍然在教室 \(c_i\) 上課。
由於更換教室的需求太多,申請不一定能獲得通過。通過計算,牛牛發現申請更換第 \(i\) 節課程的教室時,申請被通過的概率是乙個已知的實數 \(k_i\),並且對於不同課程的申請,被通過的概率是互相獨立的。
學校規定,所有的申請只能在學期開始前一次性提交,並且每個人只能選擇至多 \(m\) 節課程進行申請。這意味著牛牛必須一次性決定是否申請更換每節課的教室,而不能根據某些課程的申請結果來決定其他課程是否申請;牛牛可以申請自己最希望更換教室的 \(m\) 門課程,也可以不用完這 \(m\) 個申請的機會,甚至可以一門課程都不申請。
因為不同的課程可能會被安排在不同的教室進行,所以牛牛需要利用課間時間從一間教室趕到另一間教室。
牛牛所在的大學有 \(v\) 個教室,有 \(e\) 條道路。每條道路連線兩間教室,並且是可以雙向通行的。由於道路的長度和擁堵程度不同,通過不同的道路耗費的體力可能會有所不同。 當第 \(i\)(\(1 \leq i \leq n-1\))節課結束後,牛牛就會從這節課的教室出發,選擇一條耗費體力最少的路徑前往下一節課的教室。
現在牛牛想知道,申請哪幾門課程可以使他因在教室間移動耗費的體力值的總和的期望值最小,請你幫他求出這個最小值。
第一行四個整數 \(n,m,v,e\)。\(n\) 表示這個學期內的時間段的數量;\(m\) 表示牛牛最多可以申請更換多少節課程的教室;\(v\) 表示牛牛學校裡教室的數量;\(e\)表示牛牛的學校裡道路的數量。
第二行 \(n\) 個正整數,第 \(i\)(\(1 \leq i \leq n\))個正整數表示 \(c_i\),即第 \(i\) 個時間段牛牛被安排上課的教室;保證 \(1 \le c_i \le v\)。
第三行 \(n\) 個正整數,第 \(i\)(\(1 \leq i \leq n\))個正整數表示 \(d_i\),即第 \(i\) 個時間段另一間上同樣課程的教室;保證 \(1 \le d_i \le v\)。
第四行 \(n\) 個實數,第 \(i\)(\(1 \leq i \leq n\))個實數表示 \(k_i\),即牛牛申請在第 \(i\) 個時間段更換教室獲得通過的概率。保證 \(0 \le k_i \le 1\)。
接下來 \(e\) 行,每行三個正整數 \(a_j, b_j, w_j\),表示有一條雙向道路連線教室 \(a_j, b_j\),通過這條道路需要耗費的體力值是 \(w_j\);保證 \(1 \le a_j, b_j \le v\), \(1 \le w_j \le 100\)。
保證 \(1 \leq n \leq 2000\),\(0 \leq m \leq 2000\),\(1 \leq v \leq 300\),\(0 \leq e \leq 90000\)。
保證通過學校裡的道路,從任何一間教室出發,都能到達其他所有的教室。
保證輸入的實數最多包含 \(3\) 位小數。
輸出一行,包含乙個實數,四捨五入精確到小數點後恰好 \(2\) 位,表示答案。你的輸出必須和標準輸出完全一樣才算正確。
測試資料保證四捨五入後的答案和準確答案的差的絕對值不大於 \(4 \times 10^\)。 (如果你不知道什麼是浮點誤差,這段話可以理解為:對於大多數的演算法,你可以正常地使用浮點數型別而不用對它進行特殊的處理)
輸入 #1
3 2 3 3
2 1 2
1 2 1
0.8 0.2 0.5
1 2 5
1 3 3
2 3 1
輸出 #12.80
題面有億點長 期望dp入門題 漲自信題
上個月集訓的時候刷 noip 的題的時候因為這題的題面描述太長沒做,結果在洛谷裡的題表看見了這道題,就試了試,發現是道水題,完全擔不起 d1t3 的排面
進入正題:
#include#include#include#include#include#define r register
#define n 2020
#define v 310
using namespace std;
inline int read()
while(ch>='0'&&ch<='9')
return x*f;
}int n,m,v,g;
int e[v][v],c[n],d[n];
double p[n],f[n][n][2];
void floyd() }}
int main()
floyd();
/*for(r int i = 1;i <= v;i++)
for(r int j = 1;j <= v;j++)printf("e[%d][%d]=%d\n",i,j,e[i][j]);*/
for(r int i = 1;i <= n;i++)
for(r int j = 0;j <= m;j++)f[i][j][0] = f[i][j][1] = 2e9;
f[1][0][0] = f[1][1][1] = 0;
for(r int i = 2;i <= n;i++)
//printf("f[%d][%d] [1]=%.3f [0]=%.3f\n",i,j,f[i][j][1],f[i][j][0]);
} }double ans = 1e9;
for(r int i = 0;i <= m;i++)ans = min(ans,min(f[n][i][1],f[n][i][0]));
printf("%.2f",ans);
return 0;
}
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...