求最大子序列

C++:

#include <stdint.h>
#include<string>
#include<iostream>
#include<vector>
using namespace std;

int maxSubSum(const vector<int> &a){
int maxSum = 0;
int thisSum = 0;
for (int i = 0; i < a.size(); i++){
thisSum += a[i];
if (thisSum>maxSum)
maxSum = thisSum;
else if (thisSum < 0)
thisSum = 0;
}
return maxSum;
}

int main(){
vector<int> a = { 4, -1, 3, -7, -4, 5, 6, -9, 8 };
cout<<maxSubSum(a)<<endl;
system("pause");

}

动态规划,联机算法(on-line algorithm) 

联机算法:在任意时刻,算法对要操作的数据只读入(扫描)一次,一旦被读入并处理,它就不需要在被记忆了。而在此处理过程中算法能对它已经读入的数据立即给出相应子序列问题的正确答案。具有这种特性的算法叫做联机算法(on-line algorithm)。

算法复杂度O(n)

 

方法2:

使用递归的思想,将数列分为左半部分,右半部分和中间部分,其中左右部分可以用递归解决

而中间部分是前半部分(包含左半部分最后一个元素)的最大值和右半部分(包含右半部分的第一个值)的最大值的和 

将这三个值做比较就是最终的结果 

算法复杂度:O(N*logN) 

 

posted on 2015-07-03 19:39  Risel  阅读(138)  评论(0)    收藏  举报