动态规划是一种解决问题的算法思想,适用于那些可以被拆分成重叠子问题的情况。通过将原问题重新组合为子问题,并避免重复计算这些子问题,动态规划能够高效地求解问题。它的核心思想在于保存子问题的解,以便后续直接获取,从而避免重复计算。动态规划通常适用于具有最优子结构的问题,即局部最优解能够决定全局最优解。换句话说,可以通过解决子问题来得到最终问题的解。动态规划的关键在于找到状态转移方程,这样可以通过计算和存储子问题的解来逐步求解最终问题。总的来说,动态规划和其他遍历算法(如深度优先搜索、广度优先搜索)都是将问题拆分成子问题然后求解的方法,但动态规划的独特之处在于它保存子问题的解,以提高效率并避免重复计算。因此,当面对需要拆分成子问题并且具有最优子结构的问题时,动态规划是一个强大而高效的解决方案。
分析该题可知,我们需要获取连续数组的最大和,而非连续数组的位置,即可以定义一个新数组,每一个位置对应——以当前位置作为结束的(或开始的)连续数组和,再获取该数组的最大值即可。即将问题分解为:求解以每一个数组中元素作为结束的(或开始的)所有连续数组的最大和。
以每个位置作为结束为例:由于以当前位置作为结束的所有连续数组的最大和,为前一个位置作为结束的所有连续数组最大和加上当前值,和当前值进行比较的,两数中更大的值,所以利用动态规划的思想,取这两数中更大的值,dp数组每一个元素,即为以每一个nums元素作为截至的连续数组最大和。
最后注意边界条件的处理。
int maxSubArray(vector<int>& nums) {
if (nums.empty() == 1) {
return 0;
}
int n = nums.size();
vector<int> dp(n + 1, -10000);
dp[1] = nums[0];
for (int i = 2; i < n; i++) {
dp[i] = max((dp[i - 1] + nums[i - 1]), nums[i - 1]);
}
dp[n] = max((dp[n - 1] + nums[n - 1]), nums[n - 1]);
int ans = *(std::max_element(dp.begin(), dp.end()));
return ans;
}
int main() {
int a[] = { 5, 4, -1, 7, 8 };
int n = sizeof(a) / sizeof(a[0]); // 计算数组的长度
vector<int> num(a, a+n);
cout << maxSubArray(num) << endl;;
return 0;
}