救救孩子把qwq
查看原帖
救救孩子把qwq
448474
ximena楼主2022/4/16 15:48

wa疯了qwq

#include<bits/stdc++.h>
using namespace std;
#define bug(x) cout<<#x<<"=="<<x<<endl;
#define ll long long
#define rg register int
inline char gc()
{
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
#define gc getchar
inline ll read()
{
    char c=gc();
    ll su=0,f=1;
    for (; c<'0'||c>'9'; c=gc()) if (c=='-') f=-1;
    for (; c>='0'&&c<='9'; c=gc()) su=su*10+c-'0';
    return su*f;
}
inline void write(ll x)
{
    if (x<0)
    {
        putchar('-');
        write(-x);
        return;
    }
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void writesp(ll x)
{
    write(x),putchar(' ');
}
inline void writeln(ll x)
{
    write(x);
    putchar('\n');
}
const ll mod = 1e9+7;
#define P pair<ll,int>
#define PP pair<int,int>
const ll int maxn =3e3+10;
int c[maxn]= {0};
int d[maxn]= {0};
double dis[maxn][maxn] = { 0 };
double dp[maxn][maxn][2]= {0};
double p[maxn]= {0};
#define LL long long
int main()
{
    int n,m,v,e;
    cin>>n>>m>>v>>e;
    for(int i=1; i<=n; i++)
    {
        cin>>c[i];
    }
    for(int j=1; j<=n; j++)
    {
        cin>>d[j];
    }
    for(int i=1; i<=n; i++)
    {
        cin>>p[i];
    }
    for(int i=1; i<=v; i++)
    {
        for(int j=i+1; j<=v; j++)
        {
            dis[i][j]=1e9;
            dis[j][i]=1e9;
        }
    }
    while(e--)
    {
        int u,v;
        double w;
        cin>>u>>v>>w;
        dis[u][v]=min(dis[u][v],w);
        dis[v][u]=dis[u][v];
    }
    for(int k=1; k<=v; k++)
    {
        for(int i=1; i<=v; i++)
        {
            for(int j=1; j<=v; j++)
            {
                if(k!=i&&i!=j&&j!=k)
                {
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=0;j<=m;j++){
            dp[i][j][0]=dp[i][j][1]=1e9;
        }
    }
    dp[1][1][1]=0;
    dp[1][0][0]=0;
    for(int i=2; i<=n; i++)
    {
        for(int j=1; j<=m&&j<=i; j++)
        {
            double pp=p[i-1]*p[i]*dis[ d[i-1] ][ d[i] ]+\
                      (1-p[i-1])*p[i]*dis[ c[i-1] ][ d[i] ]+\
                      (1-p[i-1])*(1-p[i])*dis[c[i-1]][c[i]]+\
                      p[i-1]*(1-p[i])*dis[ d[i-1] ][ c[i] ];

            dp[i][j][1]=min({dp[i][j][1],dp[i-1][j-1][0]+p[i]*dis[c[i-1]][ d[i] ]+(1-p[i])*dis[ c[i-1] ][ c[i] ],\
                            dp[i-1][j-1][1]+pp});
        }
        for(int j=0; j<=i&&j<=m; j++)
        {
            dp[i][j][0]=min({dp[i][j][0],dp[i-1][j][1]+p[i-1]*dis[ d[i-1] ][ c[i] ]+(1-p[i-1])*dis[ c[i-1] ][ c[i] ],dp[i-1][j][0]+dis[ c[i-1] ][ c[i] ]});
        }
    }
    double ans=1e9;
    dp[1][1][1]=0;
    dp[1][0][0]=0;
    for(int i=0;i<=m;i++){
        ans=min({ans,dp[n][i][0],dp[n][i][1]});
    }
    printf("%.6f\n",ans);
}

2022/4/16 15:48
加载中...