动态规划算法求最大子段和

问题描述

【问题描述】
给定由n个整数组成的序列a1,a2,…,an,求该序列子段和的最大值。当所有整数均为负值时定义其最大子段和为0。
依此定义, 例如, 当(a1,a2, a3, a4, a5,a6)=(-2, 11, -4, 13, -5, -2)时,最大子段和为20。
【问题分析】
图1 图2
【算法设计】
给出算法设计思想,并用动态规划算法实现。

C语言的实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include<stdio.h>
#define MAX 100
int a[MAX];
int MaxSum(int a[],int n){
int temp = 0;
int maxsum = 0;
for(int i=1;i<=n;i++){
if(temp<0)
temp=a[i];
else
temp=temp+a[i];
if(temp > maxsum){
maxsum = temp;
}
}
return maxsum;

}
int main(){
int n;
printf("请输入n的值:");
scanf("%d",&n);
printf("请依次输入元素:");
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
printf("最大子段和为:%d\n",MaxSum(a,n));
return 0;
}

运行截图

图3