返回顶部
大江东去,浪淘尽,千古风流人物。故垒西边,人道是,三国周郎赤壁。乱石穿空,惊涛拍岸,卷起千堆雪。江山如画,一时多少豪杰。遥想公瑾当年,小乔初嫁了,雄姿英发。羽扇纶巾,谈笑间,樯橹灰飞烟灭。故国神游,多情应笑我,早生华发。人生如梦,一尊还酹江月。

Tour UVA - 1347

定义状态dp[i][j]表示一个人到i,一个人到j,保证i>j

然后倒着推

#include<bits/stdc++.h>
using namespace std;

const int maxn = 1e3+10;

struct node {
    int x,y;
}point[maxn];

double dis(int a,int b) {
    return sqrt(pow((point[a].x-point[b].x),2)+pow(point[a].y-point[b].y,2));
}

double dp[maxn][maxn];

int n;

int main() {
    freopen("in.txt","r",stdin);
    while(scanf("%d",&n)!=EOF) {
        for(int i=1;i<=n;i++) {
            scanf("%d%d",&point[i].x,&point[i].y);
        }
        memset(dp,0x43,sizeof(dp));
        for(int i=n-1;i>1;i--)
            for(int j=1;j<i;j++) {
                if(i==n-1) dp[i][j]=dis(n-1,n)+dis(j,n);
                else dp[i][j]=min(dp[i+1][j]+dis(i,i+1),dp[i+1][i]+dis(j,i+1));
            }
        printf("%.2f\n",dp[2][1]+dis(1,2));
    }
    return 0;
}
View Code

 

posted @ 2019-05-10 10:32  plysc  阅读(116)  评论(0编辑  收藏  举报