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]);
}
}