算法学习day38-动态规划

零钱兑换

核心思路

  • 就是完全背包的写法, 只是这个题是求最小值, 所以初始化的时候不能初始化0, 而是Integer.max_value

  • 以及赋值的时候, 如果dpj - coin = max, 就跳过, 说明这个硬币无法兑换=j

    java 复制代码
    public static int coinChange(int[] coins, int amount) {
        //dp[i] = 下标为i的时候 能填满的最少硬币数
        //推导
        //如果不放coins[i], dp[j]不变
        //如果放了coins[i], dp[j] = dp[j - coins[i]] + 1
        //初始化
        int[] dp = new int[amount + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int coin : coins) {
            for (int j = coin; j <= amount; j++) {
                if(dp[j - coin] == Integer.MAX_VALUE){
                    continue;
                }
                dp[j] = Math.min(dp[j], dp[j - coin] + 1);
            }
        }
        return dp[amount] == Integer.MAX_VALUE ? 0 : dp[amount];
    }

完全平方数

核心思路

  • 和零钱兑换思路几乎一致

  • dp定义: dpj代表的是 和为j的完全平方数的最小数量

  • 只是n即是物品, 也是背包容量

    java 复制代码
    public static int numSquares(int n) {
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[0] = 0;
        for (int i = 1; i <= n; i++) {
            long sqrt = (long) Math.sqrt(i);
            //不是完全平方数就跳过
            if (sqrt * sqrt != (long) i) continue;
            for (int j = i; j <= n; j++) {
                if (dp[j - i] == Integer.MAX_VALUE) continue;
                dp[j] = Math.min(dp[j], dp[j - i] + 1);
            }
        }
        return dp[n];
    }
  • 算法优化后

    • 外层i直接平方, 这样就不用判断i是否是完全平方数, i * i 一定是从小到大的完全平方数, 1、4、9等
    java 复制代码
    int[] dp = new int[n + 1];
    Arrays.fill(dp, Integer.MAX_VALUE);
    dp[0] = 0;
    for (int i = 1; i * i <= n; i++) {
        for (int j = i * i; j <= n; j++) {
            if (dp[j - i * i] == Integer.MAX_VALUE) continue;
            dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
        }
    }
    return dp[n];

单词拆分

核心思路

  • 还是完全背包问题
  • 但是该题 不是求组合,而是排列
    • 因为单词是要求有序的,比如 leetcode,code,leet, 就要先leet, 再code
例如
  • 输入: s = "catsanddog", wordDict = "cat", "cats", "and", "sand", "dog"

  • i = 3: j=0 匹配 "cat",dp3 = T。

  • i = 4: j=0 匹配 "cats",dp4 = T。

  • i = 7 ("catsand"):

  • 尝试 j = 3: dp3 是 T (cat),剩下 s3:7 是 "sand"。字典有 "sand",所以 dp7 = T。

  • 尝试 j = 4: dp4 是 T (cats),剩下 s4:7 是 "and"。字典也有 "and",所以 dp7 再次被确认是 T。
    (只要有一个 j 能通,dp7 就是 true)

  • i = 10: j=7 匹配 "dog",且 dp7 是 T,所以 dp10 = T。

  • 结果: 成功。

    java 复制代码
    public static boolean wordBreak(String s, List<String> wordDict) {
      boolean[] dp = new boolean[s.length() + 1];
      //dp的定义: 下标为i, 代表的是 从 0...i-1的单词能够被wordDict拼接而来
      dp[0] = true;
      for (int i = 1; i <= s.length(); i++) {
        for (int j = 0; j < i; j++) {
          dp[i] = dp[j] && wordDict.contains(s.substring(j, i));
          if (dp[i]) break;
        }
      }
      return dp[s.length()];
    }
相关推荐
To_OC2 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
2401_841495643 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
a1117766 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao7 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
爱刷碗的苏泓舒7 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
你想知道什么?8 小时前
线性回归-学习笔记
笔记·学习·线性回归
鱼毓屿御8 小时前
从「只会聊」到「边想边做」的跃迁
前端·学习·react.js
AOwhisky10 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
烬羽10 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法