标签:
给出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; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u011932355/article/details/47046045