题目:https://www.luogu.org/problemnew/show/P1850
注释掉了一堆愚蠢,自己还是太嫩了...
首先要注意选或不选是取 min 而不是 /2 ,因为这里的选或不选不是随机的而是取最优的;
然后注意 double 类型不能 memset ,还是要手动赋值;
其实也不算很难,却调了很久...
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=2005; int n,m,v,e,dis[305][305],c[maxn],d[maxn]; double p[maxn],f[maxn][maxn][3],ans; int rd() { int ret=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar(); return ret*f; } int main() { n=rd(); m=rd(); v=rd(); e=rd(); for(int i=1;i<=n;i++)c[i]=rd(); for(int i=1;i<=n;i++)d[i]=rd(); for(int i=1;i<=n;i++)scanf("%lf",&p[i]); memset(dis,0x3f,sizeof dis); for(int i=1,x,y,z;i<=e;i++) { x=rd(); y=rd(); z=rd(); dis[x][y]=min(dis[x][y],z); dis[y][x]=dis[x][y];// } for(int i=1;i<=v;i++)dis[i][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]); // memset(f,1,sizeof f);//!!! // for(int j=0;j<=m;j++) // { // f[n][j][0]=0; f[n][j][1]=0; // } // for(int i=n-1;i;i--) // for(int j=0;j<=m;j++) // { // f[i][j][0]=(f[i+1][j][0]+f[i+1][j][1])/2+(p[i-1]*dis[d[i]][c[i+1]]+(1-p[i-1])*dis[c[i]][c[i+1]]); // if(j)f[i][j][1]=(f[i+1][j-1][0]+f[i+1][j-1][1])/2+ // p[i]*(p[i-1]*dis[d[i]][d[i+1]] + (1-p[i-1])*dis[c[i]][d[i+1]])/2 // +(1-p[i])*dis[c[i]][c[i+1]]/2; // } // printf("%lf",f[1][m][0]+f[1][m][1]); for(int i=1;i<=n;i++)//手动memset for(int j=0;j<=m;j++) for(int k=0;k<=1;k++)f[i][j][k]=0x3f3f3f3f; f[1][0][0]=0; f[1][1][1]=0; for(int i=2;i<=n;i++) for(int j=0;j<=m&&j<=i;j++) { f[i][j][0]=min(f[i-1][j][0] + dis[c[i-1]][c[i]], f[i-1][j][1] + (1-p[i-1])*dis[c[i-1]][c[i]] + p[i-1]*dis[d[i-1]][c[i]]); if(j) f[i][j][1]=min(f[i-1][j-1][0] + (1-p[i])*dis[c[i-1]][c[i]] + p[i]*dis[c[i-1]][d[i]], f[i-1][j-1][1] + (1-p[i-1])*(1-p[i])*dis[c[i-1]][c[i]] + p[i-1]*p[i]*dis[d[i-1]][d[i]] + (1-p[i-1])*p[i]*dis[c[i-1]][d[i]] + p[i-1]*(1-p[i])*dis[d[i-1]][c[i]]); } ans=0x3f3f3f3f; for(int j=0;j<=m;j++) ans=min(ans,min(f[n][j][0],f[n][j][1])); printf("%.2lf",ans); return 0; }