[NOIP2016][期望DP]换教室

https://www.luogu.org/problem/P1850

题解 https://www.luogu.org/problemnew/solution/P1850

我居然连folyd都不会了。。。。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 const int N=2005; const double inf=1047483647.00;
 6 int n,m,v,e,c[N],d[N];
 7 double p[N],f[N][N][2];
 8 int a[305][305];
 9 int main()
10  {
11  scanf("%d%d%d%d",&n,&m,&v,&e);
12  for(int i=1;i<=n;i++) scanf("%d",&c[i]);
13  for(int i=1;i<=n;i++) scanf("%d",&d[i]);
14  for(int i=1;i<=n;i++) scanf("%lf",&p[i]);
15 
16  memset(a,0x3f,sizeof(a));
17  int x,y,z;
18  for(int i=1;i<=e;i++)
19  {scanf("%d%d%d",&x,&y,&z); a[x][y]=a[y][x]=min(a[x][y],z); }
20  for(int i=1;i<=v;i++)  a[i][i]=0;
21 
22  for(int k=1;k<=v;k++)
23   for(int i=1;i<=v;i++)
24      for(int j=1;j<=v;j++) a[i][j]=min(a[i][k]+a[k][j],a[i][j]);
25 
26  for(int i=1;i<=n;i++)
27       for(int j=0;j<=m;j++) f[i][j][0]=f[i][j][1]=inf;
28 
29  f[1][0][0]=f[1][1][1]=0;
30  for(int i=2;i<=n;i++)
31       for(int j=0;j<=min(i,m);j++)
32        {  f[i][j][0]=min(f[i-1][j][0]+a[c[i-1]][c[i]],  f[i-1][j][1]+p[i-1]*a[d[i-1]][c[i]]+(1-p[i-1])*a[c[i-1]][c[i]]);
33 
34         if(j>0)     f[i][j][1]=min(f[i-1][j-1][0]+p[i]*a[c[i-1]][d[i]]+(1-p[i])*a[c[i-1]][c[i]],
35                                            f[i-1][j-1][1]+p[i-1]*p[i]   *               a[d[i-1]][d[i]]
36                                                               +(1-p[i-1])*p[i]   *         a[c[i-1]][d[i]]
37                                                              +p[i-1]*(1-p[i])   *          a[d[i-1]][c[i]]
38                                                               +(1-p[i-1])*(1-p[i])     *  a[c[i-1]][c[i]]
39                                           );
40     }
41 
42       double ans=inf;
43    for(int j=0;j<=min(n,m);j++) ans=min(ans,min(f[n][j][0],f[n][j][1]));
44   printf("%.2f",ans);
45 return 0;
46  }

猜你喜欢

转载自www.cnblogs.com/YuXiaoze/p/11455045.html