84求助,本地RE,在线WA
查看原帖
84求助,本地RE,在线WA
403680
Torry_Q楼主2020/11/13 11:08
#include<bits/stdc++.h>
using namespace std;
int n,m,rom,path;
const int N = 2005;
const int V = 305;
const int E = 90005;
int c[N],d[N];
double k[N];
int f[V][V];
struct nod
{
    double num;
    double c,d;
}dp[N][N][2];
int main()
{
    //freopen("P1850_16.in","r",stdin);
    //freopen("cout.out","w",stdout);
    ios::sync_with_stdio(false);
    cin>>n>>m>>rom>>path;
    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>>k[i];
    }
    memset(f,0x3f,sizeof(f));
    for(int i=1;i<=path;++i)
    {
        f[i][i]=0;
    }
    for(int i=1;i<=path;++i)
    {
        int x,y,w;
        cin>>x>>y>>w;
        f[x][y]=min(f[x][y],w);
        f[y][x]=min(f[y][x],w);
    }
    for(int k=1;k<=rom;k++)
    {
        for(int i=1;i<=rom;++i)
        {
            for(int j=1;j<=rom;++j)
            {
                f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
            }
        }
    }
    for (int i=1;i<=n;i++) 
    {
		for (int j=0;j<=m;j++) 
        {
			dp[i][j][0].num=dp[i][j][1].num=0x3f3f3f3f;
		}
	}
    dp[0][0][0].c=dp[0][0][1].c=1.0;
    dp[0][0][0].d=dp[0][0][1].d=0;
    dp[1][0][0].num=0;
    dp[1][1][1].num=0;
    for(int i=1;i<=n;++i)
    {
        for(int j=0;j<=m&&j<=i;++j)
        {
            dp[i][j][0].c=1.0;
            dp[i][j][0].d=0;
            dp[i][j][1].c=1.0-k[i];
            dp[i][j][1].d=k[i];
            if(i==1) continue;
            dp[i][j][0].num=min(dp[i-1][j][0].num+f[c[i-1]][c[i]],dp[i-1][j][1].num+dp[i-1][j][1].c*f[c[i-1]][c[i]]+dp[i-1][j][1].d*f[d[i-1]][c[i]]);
            if(j!=0)
            dp[i][j][1].num=min(dp[i-1][j-1][0].num+f[c[i-1]][c[i]]*dp[i][j][1].c+f[c[i-1]][d[i]]*dp[i][j][1].d,dp[i-1][j-1][1].num+dp[i-1][j-1][1].c*dp[i][j][1].c*f[c[i-1]][i]+dp[i-1][j-1][1].d*dp[i][j][1].c*f[d[i-1]][c[i]]+dp[i-1][j-1][1].c*dp[i][j][1].d*f[c[i-1]][d[i]]+dp[i-1][j-1][1].d*dp[i][j][1].d*f[d[i-1]][d[i]]);
        }
    }
    double minn=0x3f3f3f3f;
    for(int j=0;j<=m;++j)
    {
        minn=min(minn,min(dp[n][j][0].num,dp[n][j][1].num));
    }
    cout<<setprecision(2)<<fixed<<minn;
    return 0;
}
2020/11/13 11:08
加载中...