




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.
4万+

被折叠的 条评论
为什么被折叠?



