1. 程式人生 > >「Luogu」1850 換教室

「Luogu」1850 換教室

-s 通過 fin tar show pac www. iostream max

題意:原題在這

Little Yu的n個時間段上都有兩節課同時進行,她一開始在dflt[i]教室,想去hope[i]教室,而申請通過概率為k[i],且總共有m次機會可以申請。

已知Yu的學校有v個教室,e條道路相互連通(無向圖),每條路有一個代價。
求:申請哪幾門課程能使Yu在教室之間亂跑的體力期望最小

思路:

1. dp[i][j][k]表示到第i個點,已經更改了j次,k=0這個點不更,k=1這個點更 的最小期望

2. memset不能初始化最大值會爆炸

3. dp轉移方程過於麻煩詳見代碼註釋

代碼:

#include<iostream>
#include
<cstdio> #include<cstring> #include<cmath> #include<algorithm> #define inf 999999999 #define maxm 305 #define maxn 2005 using namespace std; int n,m,v,e; double ans=inf;//一定要是inf,不能是0 int dflt[maxn],hope[maxn];//原教室和想去的教室 double dp[maxn][maxn][2],dis[maxm][maxm]; double k[maxn];//
換教室的概率 void input() { cin>>n>>m>>v>>e; for(int i=1;i<=n;i++) cin>>dflt[i]; for(int i=1;i<=n;i++) cin>>hope[i]; for(int i=1;i<=n;i++) cin>>k[i]; for(int i=1;i<=v;i++) for(int j=1;j<i;j++) { dis[i][j]
=inf; dis[j][i]=inf; } for(int i=1;i<=e;i++) { int f,g;double w; cin>>f>>g>>w; dis[f][g]=min(dis[f][g],w); dis[g][f]=dis[f][g]; } for(int k=1;k<=v;k++)//Floyd跑一發兩個教室間的距離 for(int i=1;i<=v;i++) for(int j=1;j<i;j++) { if(dis[i][j]>dis[i][k]+dis[k][j]) { dis[i][j]=dis[i][k]+dis[k][j]; dis[j][i]=dis[i][j]; } } return; } int main() { input(); for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) for(int k=0;k<=1;k++) { dp[i][j][k]=inf; } // memset(dp,inf,sizeof(dp)); dp[1][0][0]=0.0;dp[1][1][1]=0.0; for(int i=2;i<=n;i++) for(int j=0;(j<=m)&&(j<=i);j++) { dp[i][j][0]=min(dp[i-1][j][0]+dis[dflt[i-1]][dflt[i]], //這個點不換: 上個點也不換 dp[i-1][j][1]+dis[dflt[i-1]][dflt[i]]*(1-k[i-1])+dis[hope[i-1]][dflt[i]]*k[i-1]); //上個點沒換成 上個點換了 if(j>=1) { dp[i][j][1]=min(dp[i-1][j-1][0]+dis[dflt[i-1]][hope[i]]*k[i]+dis[dflt[i-1]][dflt[i]]*(1.0-k[i]), //這個點要換: 上個點沒換 這個點換了 這個點沒換成 dp[i-1][j-1][1]+dis[hope[i-1]][hope[i]]*k[i-1]*k[i]+ //上個點和這個點都換了 dis[hope[i-1]][dflt[i]]*k[i-1]*(1.0-k[i])+ //上個點換了,這個點沒換成 dis[dflt[i-1]][hope[i]]*(1.0-k[i-1])*k[i]+ //上個點沒換,這個點換成了 dis[dflt[i-1]][dflt[i]]*(1.0-k[i-1])*(1.0-k[i])); //兩個點都沒換 } } for(int i=0;i<=m;i++) for(int j=0;j<=1;j++) { ans=min(ans,dp[n][i][j]); } printf("%.2lf",ans); return 0; }

「Luogu」1850 換教室