P1850 [NOIP2016 提高组] 换教室

/*
dp[i][j][0]->前i个阶段 共申请j次 当前 i状态 换1/不换2
f[][]->0x3f->floyd

memset dp 0x3f
dp[1][0][0]=dp[1][1][1]=0 (期望*道路长(0))
dp[i][j][0]=min(dp[i-1][j][0]+f[ci-1][ci],dp[i-1][j-1][1]+f[di-1][ci]*pi-1+f[ci-1][ci]*(1-pi-1))
dp[i][j][1]=min(dp[i-1][j-1][0]+f[ci-1][ci]*(1-pi)+f[ci-1][di]*(pi), dp[i-1][j-1][1]+f[ci-1][ci]*(1-pi-1)*(1-pi)+f[ci-1][di]*(1-pi-1)*(pi)+f[di-1][ci]*(pi-1)*(1-pi)+f[di-1][di]*(pi-1)*(pi) )                                                                     
*/

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
//#include<queue>
//#include<vector>
//#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=2e5+10 ;
const int inf=0x3f3f3f3f;

int n,m,v,e;
double p[10001],dp[2001][2001][10],ans=999999999;
int a[2001][2001],c[20001],d[20001],f[2010][2010];


inline double min(double a,double b){
    return a<b?a:b;
}
int main()
{
    ios::sync_with_stdio(false);
    
    cin>>n>>m>>v>>e;
    for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>d[i];
    for(int i=1;i<=n;i++) cin>>p[i];
    
    for(int i=1;i<=v;i++)
     for( int j=1;j<i;j++)
      f[i][j]=f[j][i]=999999999;
   
    for(int i=1;i<=v;i++) f[i][i]=0;
       
    for(int i=1;i<=e;i++){
        int u,v,val;cin>>u>>v>>val;
        f[u][v]=f[v][u]=min(f[u][v],val);
    }
    
    for(int k=1;k<=v;k++)
        for(int i=1;i<=v;i++)
            for(int j=1;j<=v;j++){
                if(f[i][k]+f[k][j]<f[i][j])
                f[i][j]=f[j][i]=f[i][k]+f[k][j];
            }
    
    for(int i=1;i<=n;i++)
        for(int j=0;j<=m;j++)
            dp[i][j][0]=dp[i][j][1]=999999999;
            
    dp[1][0][0]=dp[1][1][1]=0;
    for(int i=2;i<=n;i++){
        for(int j=0;j<=min(m,i);j++){//
          dp[i][j][0]=min(dp[i-1][j][0]+f[c[i-1]][c[i]],dp[i-1][j][1]+f[d[i-1]][c[i]]*p[i-1]+f[c[i-1]][c[i]]*(1-p[i-1]));
          if(j!=0)
          dp[i][j][1]=min(dp[i-1][j-1][0]+f[c[i-1]][d[i]]*p[i]+f[c[i-1]][c[i]]*(1-p[i]),dp[i-1][j-1][1]+f[c[i-1]][c[i]]*(1-p[i-1])*(1-p[i])+f[c[i-1]][d[i]]*(1-p[i-1])*p[i]+f[d[i-1]][c[i]]*(1-p[i])*p[i-1]+f[d[i-1]][d[i]]*p[i-1]*p[i]);
       
        }
    }
    
    for(int i=0;i<=m;i++)
        ans=min(ans,min(dp[n][i][0],dp[n][i][1]));
    
    
    printf("%.2lf\n",ans);
    
    return 0;
}

 

posted @ 2023-09-22 20:51  JMXZ  阅读(6)  评论(0)    收藏  举报