算法笔记|Day33动态规划VI

算法笔记|Day33动态规划VI

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

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

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

题目分析

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

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

3.初始化:dp0=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数组含义:dpj表示和为j的完全平方数的最少数量;

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

3.初始化:dp0=0,其余dp\[\]=Integer.MAX_VALUE(为了不影响后续计算应赋dp0=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数组含义:dpj表示字符串长度为j时能否拆分为一个或多个在字典中出现的单词;

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

3.初始化:dp0=true,其余dp\[\]=false(为了不影响后续计算应赋dp0=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()];
    }
}
相关推荐
ShallWeL3 分钟前
【机器学习】(16)—— 数值数据
人工智能·python·算法·机器学习·数据分析
hongyucai28 分钟前
详解rlinf强化学习四步曲
人工智能·python·算法·架构
变量未定义~29 分钟前
ST表-龙骑士军团【算法赛】
数据结构·算法
a11177639 分钟前
SLAM 学习笔记(三)视觉里程计2(VO) 特征点法
人工智能·笔记·学习
Yang_jie_0344 分钟前
笔记:数据结构(循环队列相关判断条件)
数据结构·笔记
三品吉他手会点灯1 小时前
嵌入式机器学习 - 学习笔记1.1.2 - 机器学习的局限性与伦理
人工智能·笔记·嵌入式硬件·学习·机器学习
小帽子_1231 小时前
储能 SOC/SOH 精准估算技术:储能工况下算法优化与误差修正方案
算法
hhlongg1 小时前
FFT分析
算法
水龙吟啸1 小时前
华为2026.6.17机考选择题+编程题【速刷敲黑板】
人工智能·深度学习·算法·华为