看着紫书的分析才下的手。。想象成两个人以不同的路从起点走到终点。dp(i,j)表示1~max(i,j)全部走过,两人位置分别是i和j,还需要走多长的距离。规定i>j,i和j不特指某一个人,指的是当前在前面和后面的人。
#include <iostream>
#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <cstdlib>
#include <string>
#include <memory.h>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <ctype.h>
#define INF 1000000
#define ll long long
using namespace std;
struct point{
int x;
int y;
};
point pt[100];
int n;
double dp[100][100];
double dist2(point p1,point p2){
return sqrt((double)(p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double fun(int i,int j){
if(dp[i][j]>0)return dp[i][j];
if(i==n){
dp[i][j]=dist2(pt[j],pt[n]);
return dp[i][j];
}
double re=min(fun(i+1,j)+dist2(pt[i],pt[i+1]),fun(i+1,i)+dist2(pt[j],pt[i+1]));
dp[i][j]=re;
return re;
}
int main(){
while(cin>>n){
for(int i=0;i<=n;i++)for(int j=0;j<=n;j++)dp[i][j]=-1.0;
for(int i=1;i<=n;i++){
cin>>pt[i].x>>pt[i].y;
}
printf("%.2lf\n",fun(1,1));
}
return 0;
}