题意:给定n个点的坐标,设计一条路线,从左边的点出发,走到最右边的点然后返回,每个点除了起点和终点最多只能经历一次,求其中的最短路径。
思路:dp,可以考虑成2个人从起点出发,然后到达终点,dp(i,j)表示1-max(i,j)全部都走过,并且第一个人在i点,第二个在j点,还要走多远距离。
code:
#include <bits/stdc++.h>
using namespace std;const int N=55;
#define ft(i,s,t) for (int i=s;i<=t;i++)
#define frt(i,t,s) for (int i=t;i>=s;i--)
double x[N],y[N],d[N][N],ds[N][N];
int main()
{int n;while (~scanf("%d",&n)){ft(i,1,n) scanf("%lf %lf",&x[i],&y[i]);//memset(d,0,sizeof(d)); memset(ds,0,sizeof(ds));ft(i,1,n) ft(j,1,n) ds[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));frt(i,n-1,2) ft(j,1,i-1)if (i==n-1) d[i][j]=ds[j][n]+ds[i][n];else d[i][j]=min(d[i+1][j]+ds[i][i+1],d[i+1][i]+ds[j][i+1]);printf("%.2f\n",ds[1][2]+d[2][1]);}
}