先用弗洛伊德求出兩兩點的最短路,
設dp: fi
,j,0
表示當前走到了i這個點,申請了j次,在原點的期望距離, fi
,j,1
表示當前走到了i這個點,申請了j次,在申請點的期望距離(當然要加上沒有申請成功走到原點的期望距離),
轉移:
設ds(0/1,0/1)表示從上一輪的原點/申請點到當前的原點/申請點距離, bi
表示i這個點申請成功的機率。 fi
,j,0
=min(f
i−1,
j,0+
ds(0
,0),
fi−1
,j,1
+bi−
1∗ds
(1,0
)+(1
−bi−
1)∗d
s(0,
0))
fi,j
,1=min(f
i−1,
j−1,
0+ds
(0,1
)∗bi
+ds(
0,0)
∗(1−
bi),
(這個太
麻煩了,
讀者自己
到標程中
看吧))
複雜度:o(
n2)
#include
#include
#include
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define ds(q,w) (dis[a[i-1][q]][a[i][w]])
using
namespace
std;
typedef
double db;
const
int n=2050;
int n,m,m1;
int a[n][2];
db b[n];
int dis[n][n];
db f[n][n][2];
db ans;
int min(int q,int w)
fo(i,1,m1)dis[i][i]=0,dis[0][i]=0;
fo(k,1,m1)fo(i,1,m1)if(i!=k)
fo(j,1,m1)if(j!=i&&j!=k)dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
memset(f,127,sizeof(f));
f[1][0][0]=f[1][1][1]=0;
ans=1e9;
fo(i,2,n)
fo(j,0,min(i,m))
}ans=f[n][0][0];
fo(i,1,min(m,n))ans=min(ans,min(f[n][i][0],f[n][i][1]));
printf("%.2lf\n",ans);
return
0;}
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...
NOIP2016提高組day1 換教室
對於剛上大學的牛牛來說,他面臨的第乙個問題是如何根據實際情況申請合適的 課程。在可以選擇的課程中,有 2n 節課程安排在 n 個時間段上。在第 i 1 i n 個 時間段上,兩節內容相同的課程同時在不同的地點進行,其中,牛牛預先被安排在教室 ci 上課,而另一節課程在教室 di 進行。在不提交任何申...
2016 NOIP提高組 換教室 題解
題目傳送門 題目大意 牛牛要上 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 ...