Day 45 动态规划 part07
今日任务
-
- 爬楼梯 (进阶)
-
- 零钱兑换
- 279.完全平方数
代码实现
爬楼梯 (进阶)
完全背包应用,关键在于if判断
public static int climbStairs(int m, int n) {//如果每次可以爬m阶,则有dp[n种方法可以到达楼顶nint[] dp = new int[n + 1];dp[0] = 1;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++) {if (i >= j) {dp[i]+=dp[i - j];}}}return dp[n];}
- 零钱兑换
完全背包应用,关键在于dp[0]的初始化,和if判断,不然的话由于Integer.Max_VALUE+1会变成一个负数,带来很多问题
public int coinChange(int[] coins, int amount) {//完全背包问题 组合问题//dp[i]表示要凑成总金额为i的硬币所需的最少硬币个数int[] dp = new int[amount + 1];//初始化Arrays.fill(dp, Integer.MAX_VALUE);dp[0] = 0;for (int i = 0; i < coins.length; i++) {for (int j = coins[i]; j <= amount; j++) {if (dp[j - coins[i]] != Integer.MAX_VALUE) {dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}}return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];}
279.完全平方数
终于能照猫画虎写出一题
public int numSquares(int n) {int[] n2 = new int[101];for (int i = 0; i < 101; i++) {n2[i] = i * i;}int[] dp = new int[n + 1];Arrays.fill(dp, 10000);dp[0] = 0;for (int i = 0; i < n2.length; i++) {for (int j = n2[i]; j < n + 1; j++) {if (dp[j - n2[i]] != 10000) {dp[j] = Math.min(dp[j], dp[j - n2[i]] + 1);}}}return dp[n] == 10000 ? -1 : dp[n];}
今日总结
- 还是老生常谈,每一种不同的情况有时候只是dp[0]初始化为0和1的区,有时候是一个if判断的区别,但是想不到的话就会有很多问题
- 希望世界和平!