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