Tour
刘老师的讲解就不重复了
DP方程为:
边界:
目标:
#include<stdio.h>
#include<iostream>
#include<cmath>
#include<math.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#define ms0(a) memset(a,0,sizeof(a))
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int n;
double d[1005][1005];
struct dot{
int x,y;
}a[1005];
double getDis(dot a,dot b)
{
int dx = a.x-b.x,dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j] = 1e9;
}
int main(){
while (~scanf("%d",&n))
{
init();
for(int i=1;i<=n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[i].x=x;a[i].y=y;
}
for(int j=n-2;j>=1;j--)
{
d[n-1][j] = getDis(a[n-1], a[n])+getDis(a[j], a[n]);
for(int i=n-1;i-1>j;i--)
{
d[i-1][j] = min(d[i-1][j],d[i][j]+getDis(a[i-1], a[i]));
d[i-1][j] = min(d[i-1][j],d[i][i-1]+getDis(a[j], a[i]));
}
}
double ans = d[2][1] + getDis(a[1], a[2]);
printf("%.2f\n",ans);
}
return 0;
}