动态规划——LeetCode 53 最大子数组和

文章讲述了动态规划算法如何通过解决重叠子问题和保存子问题解来求解最大子数组问题。通过实例展示了如何使用动态规划求解连续数组的最大和,包括状态转移方程和边界条件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    动态规划是一种解决问题的算法思想,适用于那些可以被拆分成重叠子问题的情况。通过将原问题重新组合为子问题,并避免重复计算这些子问题,动态规划能够高效地求解问题。它的核心思想在于保存子问题的解,以便后续直接获取,从而避免重复计算。动态规划通常适用于具有最优子结构的问题,即局部最优解能够决定全局最优解。换句话说,可以通过解决子问题来得到最终问题的解。动态规划的关键在于找到状态转移方程,这样可以通过计算和存储子问题的解来逐步求解最终问题。总的来说,动态规划和其他遍历算法(如深度优先搜索、广度优先搜索)都是将问题拆分成子问题然后求解的方法,但动态规划的独特之处在于它保存子问题的解,以提高效率并避免重复计算。因此,当面对需要拆分成子问题并且具有最优子结构的问题时,动态规划是一个强大而高效的解决方案。

  分析该题可知,我们需要获取连续数组的最大和,而非连续数组的位置,即可以定义一个新数组,每一个位置对应——以当前位置作为结束的(或开始的)连续数组和,再获取该数组的最大值即可。即将问题分解为:求解以每一个数组中元素作为结束的(或开始的)所有连续数组的最大和。 

  以每个位置作为结束为例:由于以当前位置作为结束的所有连续数组的最大和,为前一个位置作为结束的所有连续数组最大和加上当前值,和当前值进行比较的,两数中更大的值,所以利用动态规划的思想,取这两数中更大的值,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;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值