// SumOfSubarray.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <list> using namespace std; int max(int x, int y) { return (x > y) ? x : y; } int maxSum(int * arr, int len, list<int> &listSubArray) { int retMaxSum = 0; int* Start = new int[len]; int* All = new int[len]; // Start[i] 表示arr中,前i个元素中,包含第i个元素且和最大的连续子数组 // All[i] 表示arr中,arr[0] 到 arr[i] 和最大的一段数组 //对第i+1个元素有两种选择:做为新子数组的第一个元素、放入前面找到的子数组 Start[0] = arr[0]; All[0] = arr[0]; for (int i = 1; i < len; ++i) { Start[i] = max(arr[i], arr[i] + Start[i-1]); All[i] = max(Start[i], All[i-1]); } retMaxSum = All[len-1]; int index = 0; int sum = retMaxSum; // calc subArray for (int j = len-1; j >= 0; --j) { if (Start[j] != retMaxSum) { continue; } index = j; break; } while(sum > 0) { listSubArray.push_front(arr[index]); sum -= arr[index]; --index; } delete [] Start; delete [] All; return retMaxSum; } int main(int argc, char* argv[]) { int arr[]={1, -2, 3, 10, -4, 7, 2, -5, 4, -1}; int len = sizeof(arr) / sizeof(arr[0]); list<int> listSubArray; printf("sub array sum is: %d/n", maxSum(arr, len, listSubArray)); printf("sub array as following:/n"); for (list<int>::iterator it = listSubArray.begin(); it != listSubArray.end(); ++it) { printf("%d ", *it); } printf("/n"); return 0; }