写完32pts,照着第一篇题解改完变成28pts,求查错qwq
#include<bits/stdc++.h>
using namespace std;
template<typename tp>
void read(tp & tmp)
{
char c=getchar();
while(!isdigit(c)) c=getchar();
tmp=0;
while(isdigit(c))
{
tmp=tmp*10+c-'0';
c=getchar();
}
}
template<typename tp, typename... args>
void read(tp & tmp, args& ...tmps)
{
read(tmp);read(tmps...);
}
#define For(i,j,k) for(register int i=(j); i<=(k); ++i)
int n,m,v,e;
int c[2001],d[2001];
double kkk[2001];
int f[301][301];
void Floyd()
{
For(k,1,v)
For(i,1,v)
For(j,1,v)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
double dp[2001][2001][2];
int main()
{
read(n,m,v,e);
For(i,1,n) read(c[i]);
For(i,1,n) read(d[i]);
For(i,1,n) scanf("%lf",&kkk[i]);
memset(f,0x3f,sizeof(f));
For(i,1,v) f[i][i]=0;
For(i,1,e)
{
int u,vv,w;
read(u,vv,w);
f[u][vv]=min(f[u][vv],w);
f[vv][u]=min(f[vv][u],w);
}
Floyd();
For(i,0,n) For(j,0,m) dp[i][j][0]=dp[i][j][1]=1e17+5;
dp[1][0][0]=dp[1][1][1]=0;
For(i,2,n){
dp[i][0][0]=dp[i-1][0][0]+f[c[i-1]][c[i]];
For(j,1,min(m,i))
{
int st1=c[i-1],ed1=d[i-1],st2=c[i],ed2=d[i];
dp[i][j][0]=min(min(dp[i-1][j][0]+f[st1][ed1], dp[i-1][j][1]+1.0*f[st1][ed1]*(1-kkk[i-1])+1.0*f[st2][ed1]*kkk[i-1]),dp[i][j][0]);
dp[i][j][1]=min(min(dp[i-1][j-1][0]+1.0*f[st1][ed1]*(1-kkk[i])+1.0*f[st1][ed2]*kkk[i],dp[i-1][j-1][1]+1.0*f[st1][ed1]*(1-kkk[i])*(1-kkk[i-1])+1.0*f[st1][ed2]*kkk[i]*(1-kkk[i-1])+1.0*f[st2][ed1]*(1-kkk[i])*kkk[i-1]+1.0*f[st2][ed2]*kkk[i]*kkk[i-1]),dp[i][j][1]);
/*
dp[i][j][0] = min(dp[i][j][0], min(dp[i - 1][j][0] + mp[C1][C3], dp[i - 1][j][1] + mp[C1][C3] * (1 - k[i - 1]) + mp[C2][C3] * k[i - 1]));
dp[i][j][1] = min(dp[i][j][1], min(dp[i - 1][j - 1][0] + mp[C1][C3] * (1 - k[i]) + mp[C1][C4] * k[i], dp[i - 1][j - 1][1] + mp[C2][C4] * k[i] * k[i - 1] + mp[C2][C3] * k[i - 1] * (1 - k[i]) + mp[C1][C4] * (1 - k[i - 1]) * k[i] + mp[C1][C3] * (1 - k[i - 1]) * (1 - k[i])));
*/
//dp[i][j][1]=1e9;
}
}
double ans=1e17+5;
For(i,0,m) ans=min(ans,min(dp[n][i][0],dp[n][i][1]));
printf("%.2lf",ans);
return 0;
}