求最大子序列的和
2011-06-28 19:40
148 查看
求最大子序列的和
传统的嵌套循环的解法:
/////获得最大子序列的和,复杂度O(n^2) int GetMaxSubSequence(int* arr,int len) { int i, j; int curSum; /* 当前序列和 */ int maxSum; /* 最大序列和 */ /* 初始化最大子序列和为序列第一个元素 */ maxSum = arr[0]; /* 外层循环定义子序列起始位置 */ for (i = 0; i < len; i++) { /* 起始位置为i,初始化当前和为0 */ curSum = 0; /* 内层循环定义子序列结束位置 */ for (j = i; j < len; j++) { /* 计算子序列和,并与最大子序列和比较,更新最大子序列和 */ curSum = curSum + arr[j]; /* 与最大子序列和比较,更新最大子序列和 */ if (curSum > maxSum) { maxSum = curSum; } } } return maxSum; }
高效的解法:
////获得最大子序列的和,复杂度O(n) int GetMaxSubSeq(int* arr,int len) { ////非法参数的情况 if(arr==NULL || len < 0) { return -1; } ////全是负数的情况 int index = 0; int maxNum = arr[0]; for(int i = 0;i<len;i ++){ if(arr[i] < 0) { index++; maxNum = maxNum > arr[i] ? maxNum:arr[i]; } else { break; } } if(index == len) { return maxNum; } ////不全是负数的情况 int sum = 0; int max = 0; for(int i=0;i < len;i ++) { sum += arr[i]; max=max<sum?sum :max; sum=sum>0?sum:0; } return max; }
////测试结果 int _tmain(int argc, _TCHAR* argv[]) { int *arr = new int[100]; arr[0]=1; arr[1]=-3; arr[2]=5; arr[3]=6; arr[4]=7; int maxSum = GetMaxSubSeq(arr,5); cout<<maxSum<<endl; delete[] arr; cin.get(); return 0; }
相关文章推荐
- 最大子序列之和
- 求最大连续子序列之和的线性算法 c# 数据结构
- 线性序列中同时求出最大值和最小值
- 最大子序列的N3算法
- 最大连续子序列
- hdu 5586(最大连续子序列和)
- 关于最大连续子序列和的问题 (Maximum Subsequence Sum Problem)
- DP-最大递增子序列与最大递增子数组; 最大公共子序列与最大公共子数组。
- 最大连续子序列问题(含环路)
- hdoj 1231最大连续子序列【dp】
- HDU 1231 最大连续子序列(HDU 1003 dp)
- poj 1050 To the Max 二维矩阵转换一维求子序列最大值
- hdu1231 最大连续子序列
- Python语言描述最大连续子序列和
- 最大子序列和问题
- 【codevs 1906】最长递增子序列问题(dp+最大流)
- HDU 1069 Monkey and Banana(最大的单调递减序列啊 dp)
- hdu1231 最大连续子序列
- POJ 2750Potted Flower 线段树+dp 动态求环中的最大连续子序列和
- 最大子序列问题