一、问题
环形赛道上设有n个补给站,补给站标记为a1、a2、…、an。站点间距离用di表示,d1表示第1个站点到最后一个站点之间的距离,d2表示第2个站点到第1个站点之间的距离。编写一个程序(动态规划方法)求任意两个站点间的最短距离。
二、要求
输入格式:
第一行输入一个整数n表示站点个数,第二行输入d1、d2、…、dn。第三行输入站点编号x和y。(如a1站点编号为1)
输出格式:
输出站点x和y之间的最短距离。
输入样例:
在这里给出一组输入。例如:
5
1 2 3 15 4
1 5
输出样例:
在这里给出相应的输出。例如:
1
三、代码
import java.util.ArrayList;
import java.util.Scanner;
public class Main{
static int getLength(ArrayList<Integer>arrayList,int n,int x,int y){
int total=0;
int t=0;
int dp[][]=new int[n][n];
for (int i = 0; i < arrayList.size(); i++) {
total=total+arrayList.get(i);//计算总距离
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(i==j){
dp[i][j]=0;//矩阵对角线为0
}else{
t=0;
for (int k = i; k <j; k++) {
t=t+arrayList.get(k); //计算x<y时 x->y顺时针距离
}
if(t<=total-t){//如果t>total-t则当前顺时针不是最优解 逆时针才是 用总距离-顺时针距离=逆时针
dp[i][j]=t;
}else {
dp[i][j]=total-t;
}
}
}
}
if (x>y){ //x->y 与 y->x 的最优距离是一样的
int temp=x;
x=y;
y=temp;
}
return dp[x-1][y-1];
}
public static void main(String[] args) {
ArrayList<Integer> arr=new ArrayList<>();
Scanner scanner=new Scanner(System.in);
String ss=scanner.nextLine();
int n=Integer.valueOf(ss);
ss=scanner.nextLine();
String temp[]=ss.split(" ");
for (int i = 1; i < temp.length; i++) {
arr.add(Integer.valueOf(temp[i]));
}
arr.add(Integer.valueOf(temp[0]));// 这里我代码思路第一个元素是2 而实际输入案例里1才是第一个
ss=scanner.nextLine();
String xy[]=ss.split(" ");
int x=Integer.valueOf(xy[0]);
int y=Integer.valueOf(xy[1]);
int a=getLength(arr,n,x,y);
System.out.print(a);
}
}