算法笔记|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()];
    }
}
相关推荐
一隅论数智5 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
倒头就睡的小比特5 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!5 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼5 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
深圳老胡5 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
旖旎夜光5 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark5 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her15 天前
并查集-听课笔记
笔记·算法·并查集
码流子5 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
彧azz5 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试