題目傳送門
題目大意:牛牛要上 n
nn 天課,第 i
ii 天在 c[i
]c[i]
c[i]
號教室,可以申請換至多 m
mm 天的教室,第 i
ii 天有 p[i
]p[i]
p[i]
的申請成功機率,申請成功的話就可以在 d[i
]d[i]
d[i]
號教室上課,第 i
ii 天上完課後要走到第 i+1
i+1i+
1 天的課室,給出一張圖,代表教室之間的通道情況,問申請哪些教室可以使期望路程最短。
首先這個圖只有 300
30030
0 個點,用 flo
yd
floyd
floy
d 就可以求出任意兩點的最短路。
然後就是個簡單的 01
0101
揹包,每天只有申請和不申請兩種狀態,設 f[i
][j]
[0/1
]f[i][j][0/1]
f[i][j
][0/
1]表示前 i
ii 天申請了 j
jj 次,並且第 i
ii 天選擇申請(1
11)或不申請(0
00),然後大力從前一天轉移過來即可。
轉移的時候重點考慮選的天,如果這天被選了,就有 p[i
]p[i]
p[i]
的概率在 c[i
]c[i]
c[i]
教室,有 (1−
p[i]
)(1-p[i])
(1−p[i
])的概率在 d[i
]d[i]
d[i]
教室,如果第 i
ii 天和第 i−1
i-1i−
1 天同時選,那麼就有 4
44 種情況需要大力分類討論然後把它們的期望加起來。
(這麼醜的dp居然一次ac了qwq可喜可賀)
細節就看**吧(不算醜qwq):
#include
#include
using
namespace std;
#define maxn 2010
#define inf 999999999.0
int n,m,v,e,c[maxn]
,d[maxn]
;double p[maxn]
,dp[maxn]
[maxn][2
];int f[
310]
[310];
void
floyd()
voiddp(
)}intmain()
NOIP 2016 提高組 換教室
先用弗洛伊德求出兩兩點的最短路,設dp fi j,0 表示當前走到了i這個點,申請了j次,在原點的期望距離,fi j,1 表示當前走到了i這個點,申請了j次,在申請點的期望距離 當然要加上沒有申請成功走到原點的期望距離 轉移 設ds 0 1,0 1 表示從上一輪的原點 申請點到當前的原點 申請點距離...
NOIP2016提高組 換教室
題面很長,實質很水的一道期望dp題。題面自帶勸退效果。首先用floyd算出任意兩點的最短路徑。然後設f i,j,0 為前i節課申請更換j節,且不申請第i節時的最小期望 設f i,j,1 前i節課申請更換j節,且申請第i節時的最小期望。可得下面這個超長的狀轉方程 f i,j,0 min f i,j,1...
洛谷 1850 NOIP2016提高組 換教室
題解 先用floyed處理出兩點間的最短路。設f i j k 表示走到第i個教室,總共換了j次,當前換或者不換,期望的最小移動距離。分情況討論來轉移即可。1 include2 include3 include4 define ll long long 5 define rg register 6 d...