一.理解动态规划的基本概念:
动态规划是一种解决多阶段决策过程最优化问题的数学方法。在动态规划中,问题通常被分解为多个阶段或子问题,并通过保存中间结果来避免重复计算,从而找到问题的最优解。
动态规划问题通常具有两个重要性质:重叠子问题和最优子结构。重叠子问题意味着问题的解可以通过子问题的解重复计算得到,最优子结构意味着问题的最优解可以由子问题的最优推导而来。
二.学习经典的动态规划问题:
了解和学习一些经典的动态规划问题,例如01背包问题,最长公共子序列问题,最大子序列和问题等。这些问题具有典型的动态规划解法,通过学习他们可以加深对动态规划思想的理解。
1.01背包问题:
问题描述:有一组物品,每件物品有对应的价值和重量,背包有一定的容量限制,目标是选择一些物品放入背包使得总价值最大。
例子:假设有如下的物品信息:
1. 物品1: 重量 2,价值 3
2. 物品2: 重量 3,价值 4
3. 物品3: 重量 4,价值 5
4. 物品4: 重量 5,价值 8
背包的容量限制为10
我们可以使用动态规划来解决这个问题。首先定义一个二维数组dp,其中dp[ i ] [ j ]表示在只考虑前 i 个物品,且背包容量为 j 时的最大价值。
状态转移方程:
如果第 i 个物品重量大于当前背包容量 j ,则dp[ i ] [ j ] = dp[ i - 1 ] [ j ] ,表示当前物品无法放入背包,保持上一个状态的最大价值。
如果第 i 个物品重量小于等于当前背包容量 j ,则 dp[i][j] = max(dp [i - 1][ j ], dp [i - 1][j - w[ i ]] + v [ i ] ) , 表示当前物品可以选择放入背包,比较放入和不放入的价值,选择最大的作为最优解。
公式理解: