双调旅行商问题有专门的DP算法,可参考(讲的很详细了)http://blog.csdn.net/xiajun07061225/article/details/8092247
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn = 205;
const int inf = 0x3f3f3f3f;
struct point{
double x,y;
}p[maxn];
int n;
double dis[maxn][maxn];
double dp[maxn][maxn];
double cal(int i,int j){
return sqrt((p[i].x - p[j].x)*(p[i].x - p[j].x) + (p[i].y - p[j].y)*(p[i].y - p[j].y));
}
void solve(){
dp[2][1] = dis[2][1];
for(int i=3;i<=n;i++){
for(int j=1;j<=i-2;j++) dp[i][j] = dp[i-1][j] + dis[i-1][i];
dp[i][i-1] = inf;
for(int k=1;k<=i-2;k++) dp[i][i-1] = min(dp[i][i-1] ,dp[i-1][k] + dis[k][i]);
}
dp[n][n] = dp[n][n-1] + dis[n-1][n];
printf("%.2f\n",dp[n][n]);
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dis[i][j] = cal(i,j);
dp[i][j] = inf;
}
}
solve();
}
return 0;
}