dp[i][j][1]的初始化类似 登录后复制 #include<iostream> #include<math.h> using namespace std; int L,R,d,w; const int INF=1e9; int u[10001]; int v[10001]; double dp[1000][1000][2]; void input(){ cin>>L>>R>>d>>w; for(int i=1;i<=L;i++){ cin>>u[i]; } for(int i=1;i<=R;i++){ cin>>v[i]; } } double dis(int i,int j,int flag){ if(flag==0){ return u[j]-u[i]; } if(flag==2){ return v[j]-v[i]; } else{ return sqrt(w*w+(u[i]-v[j])*(u[i]-v[j])); } } int main(){ input(); double l1=sqrt((w*1.0/2)*(w*1.0/2)+u[1]*u[1]); double l2=sqrt((w*1.0/2)*(w*1.0/2)+v[1]*v[1]); for(int i=1;i<=R;i++) { dp[0][i][0]=INF; dp[0][i][1]=l2+v[i]-v[1]; } for(int i=1;i<=L;i++) { dp[i][0][1]=INF; dp[i][0][0]=l1+u[i]-u[1]; } for(int i=1;i<=L;i++){ for(int j=1;j<=R;j++){ dp[i][j][0]=min(dp[i-1][j][0]+dis(i-1,i,0),dp[i-1][j][1]+dis(i,j,1)); dp[i][j][1]=min(dp[i][j-1][1]+dis(j-1,j,2),dp[i][j-1][0]+dis(i,j,1)); } } double res=min(dp[L][R][0]+sqrt((w*1.0/2)*(w*1.0/2)+(d-u[L])*(d-u[L])),dp[L][R][1]+sqrt((w*1.0/2)*(w*1.0/2)+(d-v[R])*(d-v[R]))); printf("%.2f",res); } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55. 原创作者: u_16969274 转载于: https://blog.51cto.com/u_16969274/11813563