算法笔记|Day33动态规划VI

算法笔记|Day33动态规划VI

  • [☆☆☆☆☆leetcode 322. 零钱兑换](#☆☆☆☆☆leetcode 322. 零钱兑换)
  • [☆☆☆☆☆leetcode 279.完全平方数](#☆☆☆☆☆leetcode 279.完全平方数)
  • [☆☆☆☆☆leetcode 139.单词拆分](#☆☆☆☆☆leetcode 139.单词拆分)

☆☆☆☆☆leetcode 322. 零钱兑换

题目链接:leetcode 322. 零钱兑换

题目分析

1.dp数组含义:dp[j]表示凑足总额为j所需钱币的最少个数;

2.递推公式:dp[j]=Math.min(dp[j],dp[j-coins[i]]+1)(分别考虑取第i个钱币与不取第i个钱币得到的钱币个数取最小值);

3.初始化:dp[0]=0,其余dp[]=Integer.MAX_VALUE(凑足总额为j所需钱币的最少个数为0,为了不影响后续计算应赋其他值为最大值Integer.MAX_VALUE);

4.遍历顺序:顺序不影响结果(考虑排列或组合均可),先遍历货币或者背包都可以,背包一定是要正序遍历。

代码

java 复制代码
class Solution {
    public int coinChange(int[] coins, int amount) {
        int dp[]=new int[amount+1];
        for(int i=1;i<dp.length;i++)
            dp[i]=Integer.MAX_VALUE;
        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];
    }
}

☆☆☆☆☆leetcode 279.完全平方数

题目链接:leetcode 279.完全平方数

题目分析

1.dp数组含义:dp[j]表示和为j的完全平方数的最少数量;

2.递推公式:dp[j]=Math.min(dp[j-i*i]+1,dp[j])(分别考虑取i的平方与不取i的平方得到的总个数取最小值);

3.初始化:dp[0]=0,其余dp[]=Integer.MAX_VALUE(为了不影响后续计算应赋dp[0]=0,其他值为最大值Integer.MAX_VALUE);

4.遍历顺序:顺序不影响结果(考虑排列或组合均可),先遍历货币或者背包都可以,背包一定是要正序遍历。

代码

java 复制代码
class Solution {
    public int numSquares(int n) {
        int dp[]=new int[n+1];
        for(int i=1;i<=n;i++)
            dp[i]=Integer.MAX_VALUE;
        for(int i=1;i<=n;i++){
            for(int j=i*i;j<=n;j++){
                dp[j]=Math.min(dp[j-i*i]+1,dp[j]);
            }
        }
        return dp[n];

    }
}

☆☆☆☆☆leetcode 139.单词拆分

题目链接:leetcode 139.单词拆分

题目分析

1.dp数组含义:dp[j]表示字符串长度为j时能否拆分为一个或多个在字典中出现的单词;

2.递推公式:if(set.contains(s.substring(j,i))&&dp[j])dp[i]=true(如果[j,i]区间的子串出现在字典里且dp[j]是true,则dp[i]=true);

3.初始化:dp[0]=true,其余dp[]=false(为了不影响后续计算应赋dp[0]=true,其他值为false);

4.遍历顺序:顺序不影响结果(考虑排列或组合均可),先遍历字符串或者字典都可以。

代码

java 复制代码
class Solution {
    public boolean wordBreak(String s, List<String> wordDict) {
        HashSet<String> set=new HashSet<>(wordDict);
        boolean dp[]=new boolean[s.length()+1];
        dp[0]=true;
        for(int i=1;i<=s.length();i++){
            for(int j=0;j<i;j++){
                if(set.contains(s.substring(j,i))&&dp[j])
                    dp[i]=true;
            }
        }
        return dp[s.length()];
    }
}
相关推荐
独处东汉9 分钟前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
乐迪信息12 分钟前
乐迪信息:AI防爆摄像机在船舶监控的应用
大数据·网络·人工智能·算法·无人机
風清掦15 分钟前
【江科大STM32学习笔记-04】0.96寸OLED显示屏
笔记·stm32·学习
放荡不羁的野指针16 分钟前
leetcode150题-滑动窗口
数据结构·算法·leetcode
胡西风_foxww20 分钟前
ObsidianAI_学习一个陌生知识领域_建立学习路径和知识库框架_写一本书
人工智能·笔记·学习·知识库·obsidian·notebooklm·写一本书
AI视觉网奇32 分钟前
huggingface-cli 安装笔记2026
前端·笔记
小龙报38 分钟前
【C语言进阶数据结构与算法】单链表综合练习:1.删除链表中等于给定值 val 的所有节点 2.反转链表 3.链表中间节点
c语言·开发语言·数据结构·c++·算法·链表·visual studio
TracyCoder1231 小时前
LeetCode Hot100(13/100)——238. 除了自身以外数组的乘积
算法·leetcode
CoderCodingNo1 小时前
【GESP】C++五级练习题 luogu-P3353 在你窗外闪耀的星星
开发语言·c++·算法
Anastasiozzzz1 小时前
LeetCode Hot100 215. 数组中的第K个最大元素
数据结构·算法·leetcode