动态规划算法是一种将原问题分解成子问题进行求解的算法,通过填表的方式来解决问题。它通常需要满足最优子结构性质和重叠子问题性质。
例题:假设有一个长度为n的数组nums,你需要从中选择一些数,使得它们的和最大,请问最大的和是多少?
分析:我们可以使用动态规划算法来解决这个问题。首先定义一个长度为n的dp数组,其中dp[i]表示以第i个元素结尾的最大子数组和。初始化dp[0]为nums[0],然后从i = 1开始遍历数组,对于每个元素nums[i],有两种选择:
- 将其加入到前面的最大子数组中,此时dp[i] = dp[i – 1] + nums[i]。
- 不将其加入到前面的最大子数组中,此时dp[i] = nums[i]。
取dp数组中的最大值作为最终结果。
Java代码实现:
public static int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
int max = dp[0];
for (int i = 1; i < n; i++) {
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
max = Math.max(max, dp[i]);
}
return max;
}
代码分析:
- 首先定义一个长度为n的dp数组,表示以nums[i]为结尾的最大子数组和。
- 初始化dp[0]为nums[0],表示以第一个元素为结尾的最大子数组和为nums[0]。
- 从i = 1开始遍历数组,对于每个元素nums[i],有两种选择:
- 将其加入到前面的最大子数组中,此时dp[i] = dp[i – 1] + nums[i]。
- 不将其加入到前面的最大子数组中,此时dp[i] = nums[i]。
- 取dp数组中的最大值作为最终结果。