小U计划进行一场从地点A到地点B的徒步旅行,旅行总共需要 M 天。为了在旅途中确保安全,小U每天都需要消耗一份食物。在路程中,小U会经过一些补给站,这些补给站分布在不同的天数上,且每个补给站的食物价格各不相同。
小U需要在这些补给站中购买食物,以确保每天都有足够的食物。现在她想知道,如何规划在不同补给站的购买策略,以使她能够花费最少的钱顺利完成这次旅行。
M:总路程所需的天数。 N:路上补给站的数量。 p:每个补给站的描述,包含两个数字 A 和 B,表示第 A 天有一个补给站,并且该站每份食物的价格为 B 元。 保证第0天一定有一个补给站,并且补给站是按顺序出现的。
测试样例 样例1:
输入:m = 5 ,n = 4 ,p = [[0, 2], [1, 3], [2, 1], [3, 2]] 输出:7
样例2:
输入:m = 6 ,n = 5 ,p = [[0, 1], [1, 5], [2, 2], [3, 4], [5, 1]] 输出:6
样例3:
输入:m = 4 ,n = 3 ,p = [[0, 3], [2, 2], [3, 1]] 输出:9 导入 Arrays 类:在代码的开头添加 import java.util.Arrays;,以便可以使用 Arrays.fill 方法。 实现 solution 方法:根据题目要求,实现 solution 方法,计算小明完成徒步所需的最少花费。 代码框架 以下是一些代码提示,帮助你实现这个思路: java import java.util.Arrays;public class Main { public static int solution(int m, int n, int[][] p) { // 初始化dp数组,dp [i]表示在第i天结束 时,小明已经花费的最 少金额 int[] dp = new int [m + 1]; // 初始化dp数组为最 大值,表示初始状态下 无法到达这些天 Arrays.fill(dp, Integer. MAX_VALUE); // 第0天不需要花费任 何钱 dp[0] = 0; // 遍历每一天 for (int i = 1; i <= m; i++) { // 遍历每个补给 站 for (int j = 0; j < n; j ++) { int day = p[j][0]; int price = p[j][1]; // 如果补给 站在第i天之 前 if (day < i) { // 更 新dp [i], 考虑在 第day 天购买 食物 dp[i] = Math. min(dp [i], dp [day] + (i - day) * price) ; } } } // 返回第m天的最小花 费 return dp[m]; } public static void main(String[] args) { // Add your test cases here System.out.println (solution(5, 4, new int[][]{{0, 2}, {1, 3}, {2, 1}, {3, 2}}) == 7); }}
关键步骤 导入 Arrays 类:在代码的开头添加 import java.util.Arrays;。 初始化 dp 数组:将 dp 数组初始化为 Integer.MAX_VALUE,表示初始状态下无法到达这些天。 状态转移:对于每一天 i,遍历每个补给站,更新 dp[i] 的值。 返回结果:最终返回 dp[m],即第 m 天的最小花费。