数组最大子段和

可以使用分治法,但是更好的方法应该是用动态规划来实现,因为每一段的结果其实可以作为其他段的结果的前提,时间复杂度 O(N)

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
30
31
#include<stdio.h>
int max(int a,int b){
return (a>b)?a:b;
}
int max_sum(int *arr,int size){
int *start = new int[size];
int *all = new int[size];
for(int i =0;i<size;i++)
start[i] = all[i] = arr[i];
for(int i = size-2;i>=0;i--){
start[i] = max(start[i],start[i+1]+arr[i]);
all[i] = max(start[i],all[i+1]);
}
int re = all[0];
delete []all;
delete []start;
delete []arr;
return re;
}
int main(){
int size;
while(~scanf("%d",&size)){
int *arr = new int[size];
for(int i =0;i<size;i++)
scanf("%d",&arr[i]);
printf("%dn",max_sum(arr,size));
}
return 0;
}