1. 程式人生 > >LOJ2360「NOIP2016」換教室

LOJ2360「NOIP2016」換教室

原題連結:https://loj.ac/problem/2360

換教室

題目描述

對於剛上大學的牛牛來說,他面臨的第一個問題是如何根據實際情況申請合適的課程。

在可以選擇的課程中,有 2 n 2n 節課程安排在 n

n 個時間段上。在第 i i 個時間段上 ( 1 i
n ) (1 \leq i \leq n)
,兩節內容相同的課程同時在不同的地點進行,其中,牛牛預先被安排在教室 c i c_i
上課,而另一節課程在教室 d i d_i 進行。
在不提交任何申請的情況下,學生們需要按時間段的順序依次完成所有的 n n 節安排好的課程。如果學生想更換第i節課程的教室,則需要提出申請。若申請通過,學生就可以在第 i i 個時間段去教室 d i d_i 上課,否則仍然在教室 c i c_i 上課。
由於更換教室的需求太多,申請不一定能獲得通過。通過計算,牛牛發現申請更換第 i i 節課程的教室時,申請被通過的概率是一個已知的實數 k i k_i ,並且對於不同課程的申請,被通過的概率是互相獨立的。
學校規定,所有的申請只能在學期開始前一次性提交,並且每個人只能選擇至多 m m 節課程進行申請。這意味著牛牛必須一次性決定是否申請更換每節課的教室,而不能根據某些課程的申請結果來決定其他課程是否申請;牛牛可以申請白己最希望更換教室的 m m 門課程,也可以不用完這 m m 個申請的機會,甚至可以一門課程都不申請。

因為不同的課程可能會被安排在不同的教室進行,所以牛牛需要利用課問時間從一間教室趕到另一間教室。
牛牛所在的大學有 v v 個教室,有 e e 條道路。每條道路連線兩間教室,並且是可以雙向通行的。由於道路的長度和擁堵程度不同,通過不同的道路耗費的體力可能會有所不同。當第 i i 1 i n 1 1 \leq i \leq n - 1 )節課結束後,牛牛就會從這節課的教室出發,選擇一條耗費體力最少的路徑前往下一節課的教室。

現在牛牛想知道,申請哪幾門課程可以使他因在教室問移動耗費的體力值的總和的期望值最小,請你幫他求出這個最小值。

輸入格式

第一行四個整數 n , m , v , e n, m, v, e n n 表示這個學期內的時間段的數量; m m 表示牛牛最多可以申請更換多少節課程的教室; v v 表示牛牛學校裡教室的數量; e e 表示牛牛的學校裡道路的數量。
第二行 n n 個正整數,第 i i 1 i n 1 \leq i \leq n )個正整數表示 c i c_i ,即第 i i 個時間段牛牛被安排上課的教室;保證 1 c i v 1 \leq c_i \leq v
第三行 n n 個正整數,第 i i 1 i n 1 \leq i \leq n )個正整數表示 d i d_i ,即第 i i 個時間段另一間上同樣課程的教室;保證 1 d i v 1 \leq d_i \leq v
第四行 n n 個實數,第 i i 1 i n 1 \leq i \leq n )個實數表示 k i k_i ,即牛牛申請在第 i i 個時間段更換教室獲得通過的概率。保證 0 k i 1 0 \leq k_i \leq 1
接下來 e e 行,每行三個正整數 a j , b j , w j a_j, b_j, w_j ,表示有一條雙向道路連線教室 a j , b j a_j, b_j ,通過這條道路需要耗費的體力值是 W j W_j ;保證 1 a j , b j v , 1 w j 100 1 \leq a_j, b_j \leq v, 1 \leq w_j \leq 100
保證 1 n 2000 1 \leq n \leq 2000 0 m 2000 0 \leq m \leq 2000 1 v 300 1 \leq v \leq 300 0 e 90000 0 \leq e \leq 90000
保證通過學校裡的道路,從任何一間教室出發,都能到達其他所有的教室。
保證輸入的實數最多包含 3 3 位小數。

輸出格式

輸出一行,包含一個實數,四舎五入精確到小數點後恰好 2 2 位,表示答案。你的輸出必須和標準輸出完全一樣才算正確。
測試資料保證四舎五入後的答案和準確答案的差的絕對值不大於 4 × 1 0 3 4 \times 10 ^ {-3} 。(如果你不知道什麼是浮點誤差,這段話可以理解為:對於大多數的演算法,你可以正常地使用浮點數型別而不用對它進行特殊的處理)

樣例
輸入樣例

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

輸出樣例

2.80

資料範圍與提示

1 n , m 2000 , 1 v 300 , 1 e 90000 1 \leq n, m \leq 2000, 1 \leq v \leq 300, 1 \leq e \leq 90000

程式碼

d p [ i ] [ j ] [ 1 / 0 ] dp[i][j][1/0] 表示考慮前 i i 節課,申請換了 j j 節課,第 i 1 i-1 節課是/否申請了調換。

然後轉移就非常自然了,只是有點小長。。。

對於申請了調換的教室,我們就要考慮調換成功/失敗兩種情況,加上當前情況的距離乘以出現概率,取 m i n