动态规划(Dynamic Programming)是一种在解决多阶段决策过程优化问题中常用的算法思想和技术。
动态规划通过把原问题分解为相对简单的子问题,并将子问题的解存储起来,避免重复计算,从而有效地求解复杂问题。其核心在于寻找最优子结构和重叠子问题。
最优子结构指的是一个问题的最优解可以由其子问题的最优解组合而成。重叠子问题是指在求解过程中,会多次遇到相同的子问题。
动态规划通常适用于具有以下特征的问题:
1. 最优子结构:问题的最优解包含了子问题的最优解。
2. 重叠子问题:在求解过程中,相同的子问题被多次求解。
通过合理定义状态和状态转移方程,动态规划能够高效地解决许多复杂的优化问题,例如求解最长公共子序列、背包问题、最短路径问题等。
例如,在求解斐波那契数列时,就可以使用动态规划的思想,避免重复计算已经求出的子问题结果,从而提高计算效率。
以下是一个使用动态规划求最大子序列和的题目:
给定一个整数数组 nums ,找到其中具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
例如,对于数组 nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] ,其最大子序列和为 6 ,对应的子序列为 [4, -1, 2, 1] 。
以下是使用动态规划解决此问题的 Python 代码示例:
def max_subarray(nums):
if not nums:
return 0
max_sum = nums[0]
current_sum = nums[0]
for num in nums[1:]:
current_sum = max(num, current_sum + num)
max_sum = max(max_sum, current_sum)
return max_sum
nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
print(max_subarray(nums))
Go 语言
package main
import "fmt"
func maxSubArray(nums []int) int {
if len(nums) == 0 {
return 0
}
maxSum := nums[0]
currentSum := nums[0]
for _, num := range nums[1:] {
currentSum = max(num, currentSum + num)
maxSum = max(maxSum, currentSum)
}
return maxSum
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
nums := []int{-2, 1, -3, 4, -1, 2, 1, -5, 4}
fmt.Println(maxSubArray(nums))
}