平面n个点 求从最左边点到最右边点再返回的最短路长 uva 1347

104 篇文章 1 订阅
32 篇文章 0 订阅
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define INF 0x3f3f3f3f
using namespace std;
int x[1010],y[1010],n;
double dp[1010][1010],d[1010][1010];
double dfs(int t1,int t2){
	if(dp[t1][t2]) return dp[t1][t2];
	if(t1 == n-1) return dp[t1][t2]=d[t1][n]+d[t2][n];
	dp[t1][t2]=min(dfs(t1+1,t2)+d[t1][t1+1],dfs(t1+1,t1)+d[t2][t1+1]);
	return dp[t1][t2];
}
int main(){
	while(scanf("%d",&n) == 1){
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
		for(int i=1;i<=n;i++){
			for(int j=i;j<=n;j++){
				d[i][j]=d[j][i]=sqrt( (double)((x[i]-x[j]) * (x[i]-x[j]) + (y[i]-y[j]) * (y[i]-y[j]) ));
			}
		}
		printf("%.2f\n",dfs(2,1)+d[1][2]);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值