如图,这份代码可以正常通过本题:
#include<bits/extc++.h>
using namespace std;
#define ld double
const int N=2048,M=512,K=1024;
int n,m,v,e,c[N],d[N],g[M][M];
ld k[N],dp[N][N][2],res;
inline void FloYd(){
for(int k=1;k<=v;k++){
for(int i=1;i<=v;i++){
for(int j=1;j<=v;j++){
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
}
}
}
int main(){
// freopen("P1850_1.in","r",stdin);
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
memset(g,0x3f,sizeof g);
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>>k[i];
for(int i=1;i<=e;i++){
int x,y,z;cin>>x>>y>>z;
g[x][y]=min(g[x][y],z);
g[y][x]=min(g[y][x],z);
}
FloYd();
for(int i=1;i<=v;i++)g[i][i]=g[0][i]=g[i][0]=0;
memset(dp,0x43,sizeof dp);
dp[1][0][0]=dp[1][1][1]=0;
for(int i=2;i<=n;i++){
dp[i][0][0]=dp[i-1][0][0]+g[c[i-1]][c[i]];
for(int j=1;j<=min(n,m);j++){
dp[i][j][0]=min(dp[i][j][0],min(dp[i-1][j][0]+g[c[i-1]][c[i]],
dp[i-1][j][1]+g[d[i-1]][c[i]]*k[i-1]+g[c[i-1]][c[i]]*(1.0-k[i-1])));
dp[i][j][1]=min(dp[i][j][1],min(dp[i-1][j-1][0]+g[c[i-1]][c[i]]*(1-k[i])
+g[c[i-1]][d[i]]*k[i],dp[i-1][j-1][1]+g[d[i-1]][d[i]]*k[i]*k[i-1]+
g[d[i-1]][c[i]]*k[i-1]*(1.0-k[i])+g[c[i-1]][d[i]]*k[i]*(1.0-k[i-1])+
g[c[i-1]][c[i]]*(1.0-k[i])*(1.0-k[i-1])));
// cerr<<fixed<<setprecision(2)<<dp[i-1][j][0]<<'\n';
// cerr<<fixed<<setprecision(2)<<g[c[i-1]][c[i]]<<'\n';
// cerr<<fixed<<setprecision(2)<<dp[i-1][j][0]+g[c[i-1]][c[i]]<<'\n';
// cerr<<fixed<<setprecision(2)<<dp[i-1][j][1]+g[d[i-1]][c[i]]*k[i-1]+g[c[i-1]][c[i]]*(1.0-k[i-1])<<'\n';
// cerr<<fixed<<setprecision(2)<<dp[i][j][0]<<' '<<dp[i][j][1]<<'\n';
}
}
res=1e18;
for(int i=0;i<=m;i++)res=min(res,min(dp[n][i][0],dp[n][i][1]));
cout<<fixed<<setprecision(2)<<res<<'\n';
}
/*
暴力出奇迹,卡常能AC。
Violent makes miracle,pursuing better constant can AC.
多测不清空,OI见祖宗。
multitesting without clearing,oier meets the LCA.
十年OI一场空,不开LL见祖宗。
Ten years of OI just AFO,no #define int long long sees the LCA.
似是神犇成才处,实为蒟蒻黄泉路。
It is likely to be the Au medal for the big old,but in fact it is the Si medal for me.
黄题有恨无正解,码力不若小学生。
A yellow problem I can't AC,codeforces is not as NB as HNO3(Dilute nitric acid).
今生无奈入OI,来世不做信竞人。
This life I am a Siliy Being in oi,next life I won't f**k the sh*t of infomatics.
*/
但是,把代码中的 #define ld double
换成 #define ld long double
,也就是把程序中的所有浮点类型使用long double
,就会不过样例;
使用cerr
语句输出程序运行过程中的一些值,可以发现出现了nan
导致异常。
所以为什么使用double
可以通过,换成long double
就会出现一些问题?是long double
的不完善,还是某种bug/特性?