悬 1 关,已经盯了一个点了,只要对代码有帮助都会感谢!
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define pil pair<int,ll>
#define ull unsigned long long
using namespace std;
const int N=2005,M=505;
const long long LINF=0x3f3f3f3f3f3f3f3fll;
const int IINF=0x3f3f3f3f;
inline void FileIO(){
freopen(".in","r",stdin);
freopen(".out","w",stdout);
}
template<typename Type>
inline void read(Type& res){
Type x=0,f=1;
char c=' ';
while(!isdigit(c)){
if(c=='-') f=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
res=x*f;
}
int n,m,v,e;
ll dis[M][M];
int c[N],d[N];
long double p[N],dp[N][N][2];
signed main(){
// 不开longlong见祖宗!
// 检查数组大小!
// 禁止在int乘int时不开longlong!
// 注意输出格式!
// STL数据类型拷贝赋值时间复杂度是 O(N)!
// 读入单个字符要用字符串,防毒瘤数据!
// (1<<63)爆ll,(1<<31)爆int!
// 看准数据范围,分档入口别写错!
// int_INF=1e9,long_long_INF=1e18!
// N,M,K,Q 别写反!
// 比较运算符要满足严格弱序!
// Think Twice, Code Once!
// 比赛结束前5min,编译运行!
// -std=c++14 -O2 -Wall -Wextra -Wshadow -Wl,--stack=536870912
read(n),read(m),read(v),read(e);
for(int i=1;i<=n;i++) read(c[i]);
for(int i=1;i<=n;i++) read(d[i]);
for(int i=1;i<=n;i++) scanf("%Lf",p+i);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=v;i++) dis[i][i]=0;
for(int i=1;i<=e;i++){
int u,v1; ll w;
read(u),read(v1),read(w);
dis[u][v1]=dis[v1][u]=min(dis[u][v1],w);
}
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][k]+dis[k][j],dis[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<=i;j++)
dp[i][j][0]=dp[i][j][1]=1e13;
}
dp[1][0][0]=dp[1][1][1]=0;
for(int i=2;i<=n;i++){
for(int j=0;j<=min(i,m);j++){
long double res1=dp[i-1][j][0]+dis[c[i]][c[i-1]];
long double res2=dp[i-1][j][1]+p[i-1]*dis[d[i-1]][c[i]]+(1.0-p[i-1])*dis[c[i-1]][c[i]];
dp[i][j][0]=min(res1,res2);
if(!j) continue;
long double res3=dp[i-1][j-1][0]+p[i]*dis[c[i-1]][d[i]]+(1.0-p[i])*dis[c[i-1]][c[i]];
long double res4=dp[i-1][j-1][1]+p[i]*p[i-1]*dis[d[i-1]][d[i]]+(1.0-p[i-1])*p[i]*dis[c[i-1]][d[i]]+p[i-1]*(1.0-p[i])*dis[d[i-1]][c[i]]+(1.0-p[i])*(1.0-p[i-1])*dis[c[i-1]][c[i]];
dp[i][j][1]=min(res3,res4);
}
}
long double ans=1e13;
for(int i=0;i<=min(n,m);i++) ans=min({ans,dp[n][i][0],dp[n][i][1]});
printf("%.2Lf\n",ans);
return 0;
}
/*
*/