算法学习-最大连续子数组

来源:互联网 发布:node v6.11.1 x64.msi 编辑:程序博客网 时间:2024/05/19 15:23

题目

给定一个数组A[0,...,n-1],求A的连续子数组,使得孩子数组的和最大。

例如数组:1,-2,3,10,-4,7,2,-5的最大子数组是:3,10,-4,7,2

分析

记S[i]为以A[i]为结尾的数组中和最大的子数组

则:S[i+1]=max(S[i]+A[i+1],A[i+1])

S[0]=A[0]

遍历i:0<=i<=n-1

动态规划:最优子问题

时间复杂度:O(n)

#include "stdafx.h"#include <iostream>#include <list>int MaxSubarray(const int* a, int size){if (!a || size <= 0)return 0;int sum = a[0]; // 当前子串的和int result = sum;  // 当前找到的最优解for (int i = 1; i < size; i++){if (sum > 0){sum += a[i];}else{sum = a[i];}result = (sum > result) ? sum : result;}return result;}int _tmain(int argc, _TCHAR* argv[]){int a[] = {1,-2,3,10,-4,7,2,-5};int m = MaxSubarray(a, sizeof(a)/sizeof(int));std::cout<<m<<'\n';system("pause");return 0;}


0 0
原创粉丝点击