博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机试题:最小花费
阅读量:4107 次
发布时间:2019-05-25

本文共 2071 字,大约阅读时间需要 6 分钟。

一看这道题,我就觉得我做不出来,因为丝毫没有头绪。。。

可是,今天不去做难道明天就回去做了吗?不会的那么多,不学可咋整啊。

一个字,做!硬着头皮也得做啊


这是一条喝碗鸡汤的分割线*:ஐ٩(๑´ᵕ`)۶ஐ:* 学习使我进步

通过的代码用了动态规划 

靠注释强行理解,似乎懂了一些,但还不够,还需要再想、再回顾。

import java.util.Scanner; public class Main {         static int[] L = new int[3];    static int[] C = new int[3];    static int A, B, N;    static int[] distance;      //distance[i] 表示 第1站 到 第i + 1站 的距离    static int[] dp;            //dp[i] 表示 第一站 到 第i + 1站 的最小花费     public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        while (sc.hasNext()) {            for (int i = 0; i < L.length; ++i) {                L[i] = sc.nextInt();            }            for (int i = 0; i < C.length; ++i) {                C[i] = sc.nextInt();            }            A = sc.nextInt();            B = sc.nextInt();            N = sc.nextInt();            distance = new int[N];            for (int i = 1; i < distance.length; ++i) {                distance[i] = sc.nextInt();            }            int res = getMinCost();            System.out.println(res);        }        sc.close();    }     //用动态规划的方法求出dp的值    private static int getMinCost() {        dp = new int[distance.length];        dp[1] = getPrice(distance[1]);  //第2站的最小花费就是 第1站 到 第2站 的花费.        for (int i = 2; i < distance.length; ++i) {            int interval = distance[i] - distance[i - 1];   //第i站 与 前一站 的间隔            //第i站 的初始赋值,就是前一站的花费 + 前一站 到第 i 站的花费            dp[i] = dp[i - 1] + getPrice(interval);                    for (int j = i - 2; j >= 0; --j) {       //试探是否可以通过前几站 直接坐到 第i站(中途不下车)                interval = distance[i] - distance[j];//第j站 到 第i站的间隔                if (interval > L[2]) {       //如果间隔大于L3的话,j前面的站就不能直达第i站了,跳出                    break;                }                dp[i] = Math.min(dp[i], dp[j] + getPrice(interval));            }        }        return dp[B - 1] - dp[A - 1];    }     //根据一段距离计算出花费    private static int getPrice(int dis) {        for (int i = 0; i < L.length; ++i) {            if (dis <= L[i]) {                return C[i];            }        }        return 0;    } }

 

转载地址:http://acssi.baihongyu.com/

你可能感兴趣的文章
Framework之View的工作原理(一)
查看>>
Web应用架构
查看>>
设计模式之策略模式
查看>>
深究Java中的RMI底层原理
查看>>
用idea创建一个maven web项目
查看>>
Kafka
查看>>
9.1 为我们的角色划分权限
查看>>
维吉尼亚之加解密及破解
查看>>
DES加解密
查看>>
TCP/IP协议三次握手与四次握手流程解析
查看>>
PHP 扩展开发 : 编写一个hello world !
查看>>
inet_ntoa、 inet_aton、inet_addr
查看>>
用模板写单链表
查看>>
用模板写单链表
查看>>
链表各类操作详解
查看>>
C++实现 简单 单链表
查看>>
数据结构之单链表——C++模板类实现
查看>>
Linux的SOCKET编程 简单演示
查看>>
正则匹配函数
查看>>
Linux并发服务器编程之多线程并发服务器
查看>>