题目大意:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为 O(n)。
例如输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,
因此输出为该子数组的和 18。
最笨的方法就是三层for循环,枚举每一种可能,得到最大的值。如果熟悉动态规划的同学应该是闭着眼睛都能拍出来吧!很简单的动态规划。
遍历到第i个数时,和最大的情况无非两种:
1、前面已经得到和值的m个数加上a[i]。
2、以a[i]作为子数组的第一个元素。
如果前面的和值sum+a[i]>a[i],则a[i]并入数组后会使和值增加,否则以a[i]为新的子数组的第一个元素可能得到最大的和值。 也可以这样理解:
sum+a[i]>a[i]的条件得到一个分割点。
由于动态规划我自己也没有学到皮毛,所以感觉自己都有点说不清楚。把代码贴上,配合代码可能更好理解一点吧!
- /*
- * Problem_3.cpp
- * 求子数组的最大和
- * Created on: 2012-8-28
- * Author: Administrator
- */
- #include<stdio.h>
- int solve(int *a,int n){
- int ans=0,max=0,i;
- for(i=0;i<n;i++){
- ans+a[i]>a[i]?ans+=a[i]:ans=a[i];
- if(ans>max)max=ans;
- }
- return max;
- }
- int main(){
- int data[8]={ 3, -1, -5, -10, -4, -7, -2, -5};
- printf("%d",solve(data,8));
- }