样例过了,8分求助
查看原帖
样例过了,8分求助
385165
ZeroF楼主2023/10/8 20:39

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int inf=1e9;
int c[2010],d[2010];
int dis[1010][1010];
double p[2010],dp[2010][2010][2];
signed main(){
	memset(dis,0x7f,sizeof(dis));
	int n,m,V,e;
	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<=e;i++){
		int u,v,w;
		cin>>u>>v>>w;
		dis[u][v]=min(dis[u][v],w);
		dis[v][u]=min(dis[v][u],w);
	}
	for(int i=1;i<=V;i++)dis[i][i]=dis[i][0]=dis[0][i]=0;
	for(int k=1;k<=V;k++)
		for(int i=1;i<=V;i++)
			for(int j=1;j<=V;j++)
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
	for(int i=0;i<=n;i++)
		for(int j=0;j<=m;j++)
			dp[i][j][0]=dp[i][j][1]=inf;
	dp[1][0][0]=dp[1][1][1]=0;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=m;j++){
			int cc=dis[c[i-1]][c[i]],dd=dis[d[i-1]][d[i]],cd=dis[c[i-1]][d[i]],dc=dis[d[i-1]][c[i]];
			dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+cc,dp[i-1][j][1]+dc*p[i-1]+cc*(1-p[i-1])));
			dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+cd*p[i]+cc*(1-p[i]),dp[i-1][j-1][1]+cc*(1-p[i])*(1-p[i-1])+cd*p[i]*(1-p[i-1])+dd*p[i]*p[i-1]+dc*p[i-1]*(1-p[i])));
		}
	double ans=inf;
	for(int i=1;i<=m;i++)ans=min(dp[n][i][0],dp[n][i][1]);
	printf("%.2lf",ans);
	return 0;
}
2023/10/8 20:39
加载中...