代码随想录 day45 第九章 动态规划 part07

动态规划五部曲模板

  1. dp数组以及下标的含义
  2. 递推公式
  3. dp数组如何初始化
  4. 遍历顺序
  5. 打印数组

● 70. 爬楼梯 (进阶)

● 322. 零钱兑换

● 279.完全平方数

详细布置

70. 爬楼梯 (进阶)

关联 leetcode 70. 爬楼梯 (进阶)
关联 卡码网:57. 爬楼梯

  • 思路

    1. dp数组以及下标的含义
      1. dpi:爬到有i个台阶的楼顶,有dpi种方法
    2. 递推公式
      1. dpi += dp i-j
    3. dp数组如何初始化
      1. dp0=1
    4. 遍历顺序
      1. 排列问题,顺序有关
      2. target在外,nums在内
    5. 打印数组
  • 题解

    复制代码
    func climbStairs(n int, m int) int {
        dp := make([]int, n+1)
        dp[0] = 1   
        for i := 1; i <= n; i++ {
            for j := 1; j <= m; j++ {
                if i-j >= 0 {
                    dp[i] += dp[i-j]
                }
            }
        }   
        return dp[n]
    }
    
    func main() {
        // 读取输入n,m
        reader := bufio.NewReader(os.Stdin)
        input, _ := reader.ReadString('\\n')
        input = strings.TrimSpace(input)
        nv := strings.Split(input, " ")
        n, _ := strconv.Atoi(nv[0])
        m, _ := strconv.Atoi(nv[1]) 
        result := climbStairs(n, m)
        fmt.Println(result)
    }

322. 零钱兑换

关联 leetcode 322. 零钱兑换

如果求组合数就是外层for循环遍历物品,内层for遍历背包。

如果求排列数就是外层for遍历背包,内层for循环遍历物品。

  • 思路

    1. dp数组以及下标的含义

      复制代码
      dp[j] : 装满容量为 j 的背包,最少物品为 dp[j]
    2. 递推公式

      复制代码
      dp[j] = min(dp[j-coins[i]] + 1,dp[j] )// +1:加一个数量0 
    3. dp数组如何初始化

      复制代码
      dp[0] = 0//非零下下标, 初始化 int_mx
    4. 遍历顺序

      1. 顺序无关
    5. 打印数组

  • 题解

    复制代码
    func coinChange(coins []int, amount int) int {
    	dp := make([]int, amount+1)
    	dp[0] = 0
    	maxValue := 2<<31 - 1
    	for i := 1; i <= amount; i++ {
    		dp[i] = maxValue
    	}
    
    	for i := 0; i < len(coins); i++ { //物品
    		for j := coins[i]; j <= amount; j++ { //背包
    			curBackpackCount := dp[j]
    			goodWeight := coins[i]
    			preGoods := dp[j-goodWeight]
    			preGoodsPlusOne := preGoods + 1
    			dp[j] = min(curBackpackCount, preGoodsPlusOne)
    
    		}
    	}
    	if dp[amount] == maxValue {
    		return -1
    	}
    	return dp[amount]
    }

279.完全平方数

关联 leetcode 279.完全平方数

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做

  • 思路

    1. dp数组以及下标的含义

      复制代码
      dp[j] : 凑成容量为 j 的背包,所需的最少元素个数
    2. 递推公式

      复制代码
      dp[j]= min(dp[j],dp[j-nums[i]+1)
    3. dp数组如何初始化

      复制代码
      dp[0] = 0//非零下标初始化成 n + 1,最小有1,可推出最大就是 n
    4. 遍历顺序

    5. 打印数组

  • 题解

    复制代码
    func numSquares(n int) int {
    	dp := make([]int, n+1)
    	dp[0] = 0
    	for i := 1; i <= n; i++ {
    		dp[i] = n + 1
    	}
    
    	goods := getAbsSqrtArray(n)
    
    	for i := 0; i < len(goods); i++ {
    		for j := goods[i]; j <= n; j++ {
    			dp[j] = min(dp[j], dp[j-goods[i]]+1)
    		}
    	}
    	return dp[n]
    }
    func getAbsSqrtArray(num int) []int {
    	ret := make([]int, 0)
    	for i := 1; i <= num; i++ {
    		if i*i <= num {
    			ret = append(ret, i*i)
    		} else {
    			break
    		}
    	}
    	return ret
    }
    
    /*解法二:省略生成完全平方数组*/
    func numSquares(n int) int {
    	dp := make([]int, n+1)
    	dp[0] = 0
    	for i := 1; i <= n; i++ {
    		dp[i] = n + 1
    	}
    
    	for i := 0; i*i <= n; i++ {
    		val := i * i
    		for j := val; j <= n; j++ {
    			dp[j] = min(dp[j], dp[j-val]+1)
    		}
    	}
    	return dp[n]
    }
相关推荐
北域码匠19 小时前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
To_OC1 天前
LC 49 字母异位词分组:想到哈希表很简单,选对 key 才是精髓
javascript·算法·leetcode
To_OC3 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
Darling噜啦啦8 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠9 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾9 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
何以解忧,唯有..9 天前
Go语言循环语句详解:for、range与循环控制
开发语言·算法·golang
Qres8219 天前
算法复键——树状数组
数据结构·算法
-森屿安年-9 天前
63. 不同路径 II
c++·算法·动态规划
踏着七彩祥云的小丑9 天前
Go学习第9天:并发编程 + 文件操作 + 正则表达式
学习·golang·正则表达式·go