本文转载自微信公众号「Java极客技术」,作者鸭血粉丝 。转载本文请联系Java极客技术公众号。
Hello 大家好,我是阿粉,前面有篇文章给大家介绍了动态规划,并通过两个案例给大家演示,后台很多小伙伴也提供了很多建议,没看过的小伙伴可以去看下什么是动态规划——从青蛙跳台阶开始了解。今天再给大家介绍两个案例,帮助大家更好的掌握也顺便回顾一下。
问:给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小,其中 arr[m][n] 表示具体的值。每次只能向下或者向右移动一步。这个问题是上篇文章中的案例的进阶篇。
根据上篇文章提供的思路,我们依次进行相关的步骤:
上面的分析可以想到,那么接下来我们就需要用代码来实现了,对于需要使用到之前的记录,我们可以考虑用二维数组来记录,所以就有了下面的这段代码。
- public int dp(int[][] arr) {
- int m = arr.length;
- int n = arr[0].length;
- if (m <=0 || n <= 0) {
- return 0;
- }
- int[][] dp = new int[m][n];
- // 初始化
- dp[0][0] = arr[0][0];
- // 初始化最左边的列
- for(int i = 1; i < m; i++){
- dp[i][0] = dp[i-1][0] + arr[i][0];
- }
- // 初始化最上边的行
- for(int i = 1; i < n; i++){
- dp[0][i] = dp[0][i-1] + arr[0][i];
- }
- for (int i = 1; i < m; i++) {
- for (int j = 1; j < n; j++) {
- dp[i][j] = Math.min(dp[i-1][j],dp[i][j-1]) + arr[i][j];
- }
- }
- return dp[m - 1][n - 1];
- }
解释下上面的代码,首先我们创建了一个二维数组 dp[m][n],用于记录到达位置的最短路径,由于当前的路径是由左边或者上边的最小路径加上当前格子的数值得到。这里我们需要找到对应关系,也就是dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + arr[i][j],这里我们需要取相邻的最小值再加上当前格子的数值。
问:给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。Leetcode 322. 零钱兑换。
- public int dp(int[] coins, int amount) {
- int[] dp = new int[amount + 1];
- int size = coins.length;
- int i = 0;
- int j = 0;
- # 定义初始值
- dp[0] = 0;
- for (i = 1; i <= amount; i++) {
- #赋值,当不能组合和输出 -1 判断使用
- dp[i] = Integer.MAX_VALUE;
- # 遍历 coins 中的硬币种类
- for (j = 0; j < size; j++) {
- if (i >= coins[j] && (dp[i - coins[j]]) != Integer.MAX_VALUE) {
- dp[i] = Math.min(dp[i - coins[j]] + 1, dp[i]);
- }
- }
- }
- if (dp[amount] == Integer.MAX_VALUE) {
- dp[amount] = -1 ;
- }
- return dp[amount];
- }
动规划的题目在 LeetCode 上面有很多,大家可以根据上面提供的思路去多刷几道题,慢慢就会有感觉了,刷完动态规划的题目,相信对大家工作或者找工作肯定有很大的帮助。https://leetcode-cn.com/problemset/all/?topicSlugs=dynamic-programming
新闻标题:聊聊笔试必刷的动态规划进阶题
URL标题:http://www.shufengxianlan.com/qtweb/news36/457086.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联