UVa 1347

来源:互联网 发布:爱淘宝怎么注册账号 编辑:程序博客网 时间:2024/06/05 15:43
#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;const double INF=0x3f3f3f3f3f3f3f3f;const int maxn=10000;double lens;int n;double dp[maxn][maxn];struct nm{    int x,y;}a[maxn];double desit(int i,int j){    double ans=(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y);    return sqrt(ans);}double solve(){    for(int i=2;i<n;i++)    {        dp[i][i-1]=INF;      for(int j=0;j<i-1;j++)      {          dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+desit(i,j));          dp[i][j]=dp[i-1][j]+desit(i,i-1);      }    }    double ans=INF;    for(int j=0;j<n-1;j++)    {        ans=min(ans,dp[n-1][j]+desit(n-1,j));    }    return ans;}int main(){    while(scanf("%d",&n)!=EOF)    {        memset(dp,0,sizeof(dp));        lens=0;     for(int i=0;i<n;i++)      {        scanf("%d%d",&a[i].x,&a[i].y);      }       dp[1][0]=desit(0,1);      lens=solve();      printf("%.2lf\n",lens);    }    return 0;}

 dp[i][i-1]=min(dp[i][i-1],dp[i-1][j]+desit(i,j));//某一个人从第j的位置走到i的位置

   dp[i][j]=dp[i-1][j]+desit(i,i-1);//从i-1走到i

还有就是这里的dp和紫书上的解析是不一样的。这里的指的是当走到i,j的时候最短的已走的路程是多少。

而紫书上的是当走到(i,j)位置的时候还需要走多长的距离。

0 0