【算法】环形赛道-java

一、问题

环形赛道上设有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);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值