算法学习—最大子段和

1.算法介绍

  最大子段和算法(Maximum Subarray Sum Algorithm)是一种用于找出给定数组中具有最大和的连续子数组的算法。这个问题也被称为最大子数组问题,是计算机科学中的一个经典问题,通常与动态规划算法相关联。

2.算法思想以及大致步骤

  解决这个问题我们可以简单的使用暴力枚举来求解,即计算所有子段元素的和,但这种方法时间复杂度较高(O (n^2)),不符合我们对高性能算法的要求,所以我们要采用动态规划对该问题进行求解。

3.算法详细步骤以及代码演示

step1:

  假设我们有以下数组a[1,-2,6,9,-6,-3,-4],我们设置一个dp数组存放子段和,为了解决最大字段和问题,我们可以将此问题看为一个计算数组中第i个元素与其前方i-1个元素和是否相加的问题:假设说我们需要计算第i个元素之前的子段和,记为dp[i],如果前方i-1个元素的和(记为dp[i-1])小于0,那么我们就无需把dp[i-1]加入至dp[i]中,由于dp[i-1]未加入到dp[i]中,此时我们可以认为,dp[i]为a[i],反之,如果dp[i-1]大于0,也就是更新后的子段和会增大,我们就可以将dp[i-1]加入到dp[i]中,此时,dp[i] = dp[i-1]+a[i]。将本问题例子代入解法中,可以得到该数组的最大子段和为[6+9] = 15

以下为计算最大子段和代码示例:

int arrayspilt(int array[],int n){
    int dp[MAX];//定义存放子段和的数组
    dp[0] = array[0];//初始化dp
    int ans = array[0];//初始化ans,用来输出最大子段和
    for (int i = 1; i < n; i++)
    {
        if (dp[i-1]>=0)//如果前i-1个元素的子段和大于0
        {
            dp[i] = dp[i-1]+array[i];//更新dp[i]的值为dp[i-1]+array[i]
        }else{
            dp[i] = array[i];//由于dp[i-1]<0,更新dp[i]的值为array[i]
        }
        if (dp[i]>ans)//如果dp[i]为最大子段和
        {
            ans = dp[i];//更新ans为最大子段和
        }
        
    }
    return ans;//返回最大子段和
}

完整代码示例:

#include<stdio.h>
#include<limits.h>
#define MAX 100

int arrayspilt(int array[],int n){
    int dp[MAX];
    dp[0] = array[0];
    int ans = array[0];
    for (int i = 1; i < n; i++)
    {
        if (dp[i-1]>=0)
        {
            dp[i] = dp[i-1]+array[i];
        }else{
            dp[i] = array[i];
        }
        if (dp[i]>ans)
        {
            ans = dp[i];
        }
        
    }
    return ans;
}

int main(){
    int n;
    printf("enter size");
    printf("\n");
    scanf("%d",&n);
    int array[n];
    printf("\n");
    printf("enter array:");
    printf("\n");
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &array[i]);
    }
    int maxdp = arrayspilt(array,n);
    printf("%d",maxdp);
    return 0;
}

交流学习可联系:liwencong@student.gdufe.edu.cn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值