标签:new typename iostream names div 数据结构和算法 cout namespace 时间复杂度
输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
设currSum(i)为前i个元素中,以第i个元素为结尾,和最大的连续子数组的和。那么可得一下递推公式
currSum(i+1) = currSum(i) + a(i) (currSum >= 0)
a(i) (currSum < 0)
以上公式很好理解,对于currSum(i+1)来说,等于currSum(i)加上 a[i],但如果currSum(i) < 0,加上一个负数的话,一定会比不加小,所以索性不加
那么求数组a[n]的最大子数组的问题,就转化成在Max (currSum(i)) (1<= i <=size)
基于以上的思想,总结出以下两总实现
1. 此实现中的借用一个辅助的数组currSum[n],currSum[i]代表以i个元素为结尾的所有子数组中的最大和
首先遍历数组a[n],得到currSum[n],然后从数组currSum[n]的所有元素中找到最大的那个即可得到答案
1 // Author : Jincheng 2 // Date : 170315 3 // Description : find max sum of subarray by DP method 4 // Complexity : Time O(n) Space O(n) 5 6 #include <iostream> 7 using namespace std; 8 9 template <typename T> 10 void Print(T *a,int size); 11 12 template <typename T> 13 void MaxSumSubarray(T *a,int size) 14 { 15 T *currSum = new T[size+1]; // 辅助数组 16 currSum[1] = a[1]; 17 T maxSum ; // 全局的最大值 18 for(int i = 2;i <= size;i++) 19 { 20 if(currSum[i-1] < 0) 21 { 22 currSum[i] = a[i]; 23 } 24 else 25 { 26 currSum[i] += a[i]; 27 } 28 } 29 maxSum = [1]; 30 for(int i = 2;i<=size;i++) 31 { 32 if(maxSum < currSum[i]) 33 { 34 maxSum = currSum[i]; 35 } 36 } 37 cout << "the max sum of subarray is " << maxSum << endl; 38 39 delete b; 40 } 41 42 int main() 43 { 44 int a[] = {0,-1,-2,-7,-8,-5}; 45 Print(a,5); 46 MaxSumSubarray(a,5);47 return 0; 48 } 50 51 template <typename T> 52 void Print(T *a,int size) 53 { 54 for(int i=1;i <= size;i++) 55 56 cout << "a[" << i << "] = " << a[i] << endl; 57 }
标签:new typename iostream names div 数据结构和算法 cout namespace 时间复杂度
原文地址:http://www.cnblogs.com/amekajier/p/6567564.html