Poj 2677 Tour//DP

/*Poj 2677 Tour
DP 双调欧几里得旅行商问题
转移方程 :
当j = i - 1: d[i][i-1] = min{d[i-1][k] + p[i][k]} (1<=k<i-1)
当j < i - 1: d[i][j] = d[i-1][j] + p[i-1][i]
*/
#include<cstdio>
#include<cstring>
#include<cmath>
#define Min(a,b) (a<b?a:b)
using namespace std;
const int maxn = 205;
const double INF = 1000000000.0;
double d[maxn][maxn];
struct Points
{
    int x;
    int y;
} P[maxn];
int n;
double getDis(int i,int j)
{
    double x = P[i].x - P[j].x;
    double y = P[i].y - P[j].y;
    return sqrt(x*x + y*y);
}
void input()
{
    for(int i = 1; i <= n; i++)
        scanf("%d%d",&P[i].x,&P[i].y);
}
void init()
{
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= n; j++) d[i][j] = INF;
    }
}
void solve()
{
    d[2][1] = getDis(2, 1);
	for(int i = 2; i< n; i++)
		for(int j = 1; j < i; j++) {
            d[i + 1][j] = d[i][j] + getDis(i, i + 1);
			d[i + 1][i] = Min(d[i + 1][i], d[i][j] + getDis(j, i + 1));
		}
	double re = d[n][n-1] + getDis(n,n-1);
	printf("%.2f\n", re);
}
int main()
{
    while(scanf("%d",&n) != EOF)
    {
        input();
        init();
        solve();
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值