徒步旅行中的补给问题| 豆包MarsCode AI刷题

77 阅读4分钟

代码实现:public class Main { public static int solution(int n, int k, int[] data) { // Edit your code here int length = data.length; //创建dp数组,这里注意,最后一天已经到了,就不用买食物了 int[] dp = new int[length]; //基本事件:第一天至少要买一份食物 dp[0] = data[0]; //迭代:dp[i]代表当负重为k时,第i天路程的最小花费(食物刚好吃完) for(int i = 1;i < length;i++){ //直接买 dp[i] = dp[i-1] + data[i]; //之前买的,吃库存 for(int j = i - 1;j >= i-k+1 && j >= 0;j--){ dp[i] = Math.min(dp[i],dp[i-1] + data[j]); } } return dp[length-1]; }

public static void main(String[] args) {
    // Add your test cases here

    System.out.println(solution(5, 2, new int[]{1, 2, 3, 3, 2}) == 9);
    System.out.println(solution(6, 3, new int[]{4, 1, 5, 2, 1, 3}) == 9);
    System.out.println(solution(4, 1, new int[]{3, 2, 4, 1}) == 10);
}

}

题目解析

以一道动态规划类的题目为例,比如给定一个整数数组,求其最长递增子序列的长度。思路上,动态规划关键在于定义状态和找出状态转移方程。对于这道题,我们定义 dp[i] 表示以第 i 个元素结尾的最长递增子序列的长度。初始化时,每个 dp[i] 至少为 1,因为自身可构成长度为 1 的子序列。然后通过遍历数组,对于每个元素,再去和它之前的元素比较,如果前面的元素小于当前元素,就可以尝试更新当前元素对应的 dp 值,即 dp[i] = max(dp[i], dp[j] + 1)j 是小于 i 的索引),最后找出 dp 数组中的最大值就是最长递增子序列的长度。虽然这题没有复杂的图解,但可以想象数组元素依次排列,通过连线表示递增关系来辅助理解状态转移过程。这样清晰的思路分析,能帮助我们有条不紊地解决此类问题。

知识总结

在刷题过程中,新接触到了很多巧妙的算法思想和细节知识点。比如动态规划中不同类型的状态定义方式,像以单个元素、区间或者二维坐标等来定义,不同的定义适用于不同的场景。理解上,状态定义就是对问题进行合理拆解,用一种数学化的形式去描述问题的某个阶段,而状态转移方程则像是各个阶段之间沟通的桥梁,告诉我们如何从前面的阶段推导出后面阶段的结果。对于入门同学,建议一定要多思考每个状态的实际含义以及状态转移的合理性,多做几道同类型不同变化的题目去巩固理解。

学习计划

制定高效的刷题计划至关重要。首先,要按照知识点分类刷题,比如先集中攻克数组相关的题目,掌握扎实后再进入树、图等知识点。在刷题时,不要一味追求数量,每做完一题,仔细分析思路、代码实现以及时间空间复杂度等。对于错题,要整理到专门的错题本中,不仅记录错误的解法和正确答案,更要剖析错误原因,是思路没理解对,还是代码细节出现失误等。然后定期回顾错题,重新做一遍,检验自己是否真正掌握,有针对性地查漏补缺,这样能让知识体系更加完善。

工具运用

AI 刷题功能可以和很多学习资源结合发挥更大作用。比如配合线上的算法课程学习,先通过课程掌握理论知识和基本思路,然后用 AI 刷题进行实践巩固,遇到不懂的题目,利用 AI 详细的解析去加深理解。还可以结合线下的算法书籍,在书籍中系统学习算法原理,再在 AI 刷题平台上找对应的题目练手。同时,与学习论坛结合,把刷题中遇到的疑难问题发布出去,参考大家的讨论以及自己 AI 刷题得到的答案,全方位提升解题能力。 总之,合理利用豆包 MarsCode AI 刷题功能,并结合多样的学习资源和科学的学习方法,能让编程学习更加高效,助力我们不断提升自己的能力。