动态规划求解最大连续子序列和

问题描述
输入一组整数,求出这组数字连续子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:
序列: -2 11 -4 13 -5 -2 ,则最大连续子序列和为 20
序列: -6 2 4 -7 5 3 2 -1 6 -9 10 -2 ,则最大连续子序列和为 16

分析
能想起来的用动态规划方法解决的最简单的题目了。其它方法时间代价过大,动态规划的时间代价仅为O(n)
设数组共有n个元素,A[0]~A[n-1]
定义一个辅助数组Max[n],其中Max[i]表示以数组第i个元素结尾的最大连续子序列的和
则Max[i]的取值为下列两个值的最大值:Max[i-1]+A[i], A[i]
最后只需遍历一边Max数组,找出其最大值即可
程序源码
#include 
#include 
int findMax(int a[], int num);
int max(int a, int b);
int main()
{
      int a[8] = {1, -2, 3, 10, -4, 7, 2, -5};
      int result = findMax(a, 8);
      printf("%d", result);
      getch();
      return 0;
}

int findMax(int a[], int num)
{
    int result;
    int sum[num];
    sum[0] = a[0];
    result = a[0];
    for (int i = 1; i < num; i ++)
    {
        sum[i] = max(a[i], sum[i-1]+a[i]);
        result = max(result, sum[i]);
    } 
    return result;
}

int max(int a, int b)
{
    if (a >= b)
         return a;
    return b;
}

你可能感兴趣的:(动态规划)