旅行 -----Tour

uva 1347      这道题,我并没有完全的理解,只是将书中的思想梳理了一下,将代码重敲了一下,做个记录,以后加深记忆

import java.util.Scanner;

public class uva1347 {
	private static int maxn = 50 + 5; //节点的最大数量 为什么加5
	private static double []x = new double[maxn];
	private static double []y = new double[maxn]; //保存各个点的横纵坐标
	private static double [][] dist; //保存的是任意两个点之间的距离
	private static double [][] d;  //保存的是最终求解的过程
	private static int n; //这里的n代表的是点的数量
	
	public static void main(String[] args) {
		//初始化两个二维数组
		for (int i=0; i<maxn; i++){
			dist[i] = new double[maxn];
			d[i] = new double[maxn];
		}
		
		for (int i=1; i<=n; i++){
			//初始化数组x和数组y的,代码省了
			Scanner scanner  = new Scanner(System.in);
			x[i] = scanner.nextInt();
			y[i] = scanner.nextInt();
		}
		//求的是任意两个点之间的距离
		for (int i=1; i<=n; i++){
			for (int j=1; j<=n; j++){
				dist[i][j] =  Math.sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
			}
		}
		//我感觉这个求解过程是倒着来的,即从终点开始,根据规律,倒推到起点。
		//而为什么倒着来呢,因为两个人都需要走到终点   同时,我们能很清楚的定义边界条件d[n-1,j] = dist[n-1,n] + dist[j][n]
		//上面的边界条件定义的真是很经典。
		for (int i=n-1; i>=2; i--){
			for (int j=1; j<i; j++){
				if (i == n-1){
					d[i][j] = dist[i][n] + dist[j][n];
				}else{
					d[i][j] = Math.min(dist[i][i+1] + d[i+1][j], dist[j][i+1] + d[i+1][i]);
				}
			}
		}
		//根据题意,第一步一定是某个人走到了第二个节点,所以一定是d(2,1)
		System.out.println(dist[1][2] + d[2][1]);
		
	}
	
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值