本文主要是介绍Day45 动态规划 part07,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Day45 动态规划 part07
57. 爬楼梯(卡码网)
我的思路:
和昨天的组合总和题几乎一模一样的代码
解答:
import java.util.*;public class Main {public static void main (String[] args) {Scanner myScanner = new Scanner(System.in);int n = myScanner.nextInt();int m = myScanner.nextInt();int[] steps = new int[m];for(int i = 0; i < m; i++) {steps[i] = i + 1;}BagProblem(steps, n);}public static void BagProblem(int[] steps, int n) {int[] dp = new int[n + 1];dp[0] = 1;for(int i = 0; i < dp.length; i++) {for(int step: steps) {if(i >= step) {dp[i] += dp[i - step];}}}System.out.println(dp[n]);}
}
279.完全平方数
我的思路:
这次的状态转移方程是dp[i] = Math.min(dp[i], dp[i - j *j] + 1),比较自身与dp数组中i - j *j与j *j的组合(该情况的组合数就是dp[i - j *j] + 1)
因为是比最小,初始化dp数组值为无穷大Integer.MAX_VALUE
解答:
class Solution {public int numSquares(int n) {int[] dp = new int[n + 1];for(int i = 1; i < dp.length; i++) {dp[i] = Integer.MAX_VALUE;for(int j = 1; j *j <= i; j++) {dp[i] = Math.min(dp[i], dp[i - j *j] + 1);}}return dp[n];}
}
322. 零钱兑换
我的思路:
和上一题一样,考察组合,数字可以重复使用
状态转移方程模仿可以写出,dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1)
这里为了方便比较(存在无法组合输出-1的情况),比较更小值的时候,没有用Integer.MAX_VALUE,用的amount + 1
解答:
class Solution {public int coinChange(int[] coins, int amount) {int[] dp = new int[amount + 1];Arrays.fill(dp, amount + 1);dp[0] = 0;for(int i = 0; i < coins.length; i++) {for(int j = coins[i]; j <= amount; j++) {dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);}}return dp[amount] > amount ? -1 : dp[amount];}
}
这篇关于Day45 动态规划 part07的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!