【问题描述】
给定由n个整数(可能为负整数)组成的序列a1,a2, a3… , an, 寻找它的某个连续子段,使得其和最大。
例如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。
【思路】
前 i个数的累加和的最大值
状态转移方程:F[i] = max(F[i-1] + a[i], a[i])
【输入】
6
-2 11 -4 13 -5 -2
【输出】
20
代码显示如下:
#include<stdio.h>
#define SIZE 100
int main() {
int n; //n个整数
int a[SIZE]; //n个整数组成的序列
int F[SIZE]= {0}; //表示前 i项 的累加和的最大值
scanf("%d", &n);
for(int i=0; i<n; i++) scanf("%d", &a[i]);
if(a[0]>0) F[0] = a[0]; //第一个数若 >0,则 F[0]=a[0];否则 F[0]=0(初始定义中以定义)
//状态转移方程转换
for(int i=1; i<n; i++)
if(F[i-1] > 0) F[i] = F[i-1] + a[i];
else F[i] = a[i];
//求F[i]中的最大值
int max = F[0];
for(int j=0; j<n; j++) {
if(F[j]>max) max = F[j];
}
printf("%d", max);
return 0;
}