动态规划是一种常见的算法思想,用于解决具有重叠子问题和最优子结构特征的问题。动态规划算法通常涉及到将问题分解成一系列子问题,并且通过求解子问题的最优解来计算原问题的最优解。
具体地,动态规划算法通常包括以下步骤:
1. 定义状态:将原问题划分为若干个子问题,并定义状态表示原问题和子问题的解。
2. 初始状态:确定初始问题的解,通常为最简单的子问题的解。
3. 状态转移方程:通过求解子问题的最优解来推导出原问题的最优解,并且使用状态转移方程来描述子问题之间的关系。
4. 计算最优解:根据状态转移方程和初始状态,计算出原问题的最优解。
例如,背包问题是一个经典的动态规划问题。背包问题的目标是在给定的一定容量和一组物品的情况下,选择物品使得能够装入背包的物品总价值最大。这个问题可以分解为若干个子问题,每一个子问题表示对一部分物品的选择。使用动态规划算法,可以依次求解每个子问题的最优解,并且通过状态转移方程推导出原问题的最优解。
总之,动态规划算法通过将原问题分解成若干个子问题,并且通过求解子问题的最优解来计算原问题的最优解。这种算法思想在许多领域都有广泛的应用,比如计算机科学、数学、经济学等等。
leetcode 53 最大子序列和(Maximum Value Contiguous Subsequence)
题目描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
解题思路:
这题太简单了,只是简要列出思路。
1、定义两个变量
tempSum:存储之前的累加和
maxSum: 存储当前的最大和。
2、遍历数组,当第i个数时,主要更新两个变量就可以:
判断前面累加和是否为负值,如果为负值,则累加和更新为当前值;否则,继续累加当前值
判断累加和是否大于最大和,如果大于最大和,则更新为累加和;否则,继续保留之前的最大和。
本题代码实际操作验证参考leetcode53