H - 顺序表应用8:最大子段和之动态规划法

Description

给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。

注意:本题目要求用动态规划法求解,只需要输出最大子段和的值。
Input

第一行输入整数n(1<=n<=100000),表示整数序列中的数据元素个数;

第二行依次输入n个整数,对应顺序表中存放的每个数据元素值。
Output

输出所求的最大子段和

Sample

Input

6
-2 11 -4 13 -5 -2
Output

20

#include<stdio.h>
#include<malloc.h>
#include<algorithm>
using namespace std;
int k=0;
int donggui(int a[],int n)
{
    int sum = 0,ans = 0;
    for(int i=0;i<n;i++)
    {
        if(sum+a[i]>0)
        {
            sum += a[i];
            ans = max(sum,ans);
        }
        else sum = 0;
    }
    return ans;
}
int main()
{
    int n,a[50010],t,i;
    scanf("%d",&n);
    for(i=0; i<n; i++)
    {
        scanf("%d",&a[i]);
    }
    t=donggui(a,n-1);
    printf("%d\n",t);
    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 最大子段和问题是指在一个数列中找到一个连续的子序列,使得该子序列的和最大。分治递归是一种解决该问题的方。 具体步骤如下: 1. 将原数列分成两个子序列,分别求出左子序列的最大子段和、右子序列的最大子段和和跨越中点的最大子段和。 2. 左子序列的最大子段和、右子序列的最大子段和和跨越中点的最大子段和中的最大值即为当前序列的最大子段和。 3. 递归地对左子序列和右子序列进行上述操作,直到序列长度为1。 4. 最终得到的最大子段和即为原数列的最大子段和。 该方的时间复杂度为O(nlogn),比暴力枚举的O(n^2)更优。 ### 回答2: 最大子段和问题是一个经典的计算机算问题,它的目标是在一个包含正、负数的数组中找到一个连续子数组,使得该子数组的元素之和最大。在进行优化问题时,可以通过分治递归来解决。顺序表应用7:最大子段和之分治递归,就是利用递归方来解决最大子段和的问题。 最大子段和之分治递归的核心思想是将问题分解成小问题进行解决。具体来说,将整个数组一分为二,分别求出左、右子数组的最大子段和,然后求出跨越中点的最大子段和。最后,取这三个值中的最大值作为整个数组的最大子段和。 对于左、右子数组,采用同样的方进行分治递归,直到只剩下一个元素,此时的最大子段和就是该元素本身。而对于跨越中点的最大子段和,需要从中点向左、向右分别寻找最大和,再将左右的最大和相加得到横跨中点的最大和。 最后,将左、右、中三个元素的最大值返回,逐层向上求解,得到整个数组的最大子段和。这个算的时间复杂度为O(nlogn),空间复杂度为O(logn)。 最大子段和问题是实际问题中非常常见的问题,比如在股票分析、金融风险评估等领域都有它的应用。通过学习分治递归解决最大子段和问题,可以更好地理解递归思想,并且为实际问题提供解决思路。 ### 回答3: 最大子段和问题是计算一个给定序列中最大的子序列之和的问题。这个问题可以使用分治算来解决。 首先,假设我们要求一个序列的最大子段和。我们可以将这个序列分成两个部分:前半部分和后半部分。然后我们可以再对这两个部分分别求出最大子段和。 接下来,我们需要考虑一个跨过中点的最大子段和。这个最大子段和可以通过计算左半部分的最大后缀和和右半部分的最大前缀和来确定。我们可以将这两个值相加,得到跨越中点的最大子段和。 最后,我们选择这三个值中的最大值。这个最大值就是整个序列的最大子段和。 我们可以用分治算的递归方式来实现这个方。对于每个子序列,我们递归地计算左半部分的最大子段和、右半部分的最大子段和和跨越中点的最大子段和。最后,我们选择三个值中的最大值作为整个序列的最大子段和。 虽然这个方看起来比暴力解决方案要更复杂,但它的时间复杂度为O(n log n),比暴力解决方案的O(n^2)要快得多。因此,分治算是一种有效的解决最大子段和问题的方

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值