给出n个点,按X坐标升序给出,从1号点走到N号点再返回1号点所需的最小距离,要求所有点至少被走到一次
要求1->n的路上所经过的点X坐标升序
n->1路上所经过的点X坐标降序
具体详解参考:http://blog.csdn.net/xiajun07061225/article/details/8092247
#include "stdio.h"
#include "string.h"
#include "math.h"
const double inf=999999999.0;
int n;
struct node
{
double x,y;
}a[210];
double dis[210][210],dp[210][210];
double cal(int i,int j)
{
return sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
}
void DP()
{
int i,j;
double temp;
dp[1][2]=dis[1][2];
for (j=3;j<=n;j++)
{
//i<j-1
for (i=1;i<j-1;i++)
dp[i][j]=dp[i][j-1]+dis[j-1][j];
//i=j-1
for (i=1;i<j-1;i++)
{
temp=dp[i][j-1]+dis[i][j];
if (temp<dp[j-1][j])
dp[j-1][j]=temp;
}
}
dp[n][n]=dp[n-1][n]+dis[n-1][n];
}
int main()
{
int i,j;
while (scanf("%d",&n)!=EOF)
{
for (i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
{
dis[i][j]=cal(i,j);
dp[i][j]=inf;
}
DP();
printf("%.2lf\n",dp[n][n]);
}
return 0;
}