目录
全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。
一、前言
动态规划(Dynamic Programming, DP)是一种通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划的关键在于存储子问题的解,以避免重复计算,这通常是通过一个表(或数组)来实现的。当解决子问题时,动态规划利用已经解决的子问题的解来构建当前问题的解。这种方法通常用于解决最优化问题。
二、动态规划的基本步骤
- 定义状态:首先,我们需要将问题分解成一系列的子问题,并定义状态变量来表示这些子问题的解。
- 状态转移方程:找到状态变量之间的关系,即状态转移方程,用于根据已知的状态计算新的状态。
- 初始化:定义状态变量的初始值。
- 计算顺序:确定计算状态的顺序,这通常与问题的结构有关。
- 边界条件:考虑问题的边界情况,确保状态转移方程在边界上也是有效的。
三、部分例子
斐波那契数列
斐波那契数列是一个非常经典的动态规划问题,数列的定义是:F(0)=0, F(1)=1, 对于n>1, F(n)=F(n-1)+F(n-2)。
动态规划解法
- 定义状态:
dp[i]
表示斐波那契数列的第i
项的值。 - 状态转移方程:
dp[i] = dp[i-1] + dp[i-2]
(对于i > 1
)。 - 初始化:
dp[0] = 0
,dp[1] = 1
。 - 计算顺序:从
dp[2]
开始,一直到dp[n]
。 - 边界条件:已经在初始化中考虑。
Python代码实现
def fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
dp = [0] * (n + 1)
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
return dp[n]
# 测试
print(fibonacci(10)) # 输出 55
最长公共子序列(LCS)
动态规划解法
- 定义状态:
dp[i][j]
表示text1
的前i
个字符和text2
的前j
个字符之间的最长公共子序列的长度。 - 状态转移方程:
- 如果
text1[i-1] == text2[j-1]
,则dp[i][j] = dp[i-1][j-1] + 1
。 - 否则,
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
。
- 如果
- 初始化:
dp[0][j] = 0
(对于所有j
),dp[i][0] = 0
(对于所有i
)。 - 计算顺序:按行和列的顺序计算
dp
数组。 - 边界条件:已经在初始化中考虑。
动态规划是解决许多复杂问题的强大工具,其关键在于识别问题的重叠子问题和最优子结构。
感谢大家点赞、收藏、关注、评论啦 、获取联系方式在个人简介绿泡泡