最大子列和(分而治之算法与在线处理算法)

终于赶在星期的边上完成了C++的学习,一星期学完C++不是梦
然后紧接着开始了数据结构的学习,遇到了这道复杂度分析的经典入门题——最大子列和
相信很多人在分析分而治之算法的时间复杂度的时候都会有一些迷惑,其实想要理解复杂度,最好的办法是去结合代码
以下:

#include
#include
#include
using namespace std;

int num[100001];

int cal(int low,int hig){
	if (low == hig)
		return num[low];

	int mid = low + hig >> 1;
	int lrev = cal(low, mid);
	int rrev = cal(mid+1, hig);

	int ans = 0, lmax = num[mid], rmax = num[mid + 1],sum=0;
	for (int i = mid; i >=low ; i--) {
		sum += num[i];
		if (sum > lmax)
			lmax = sum;
	}
	sum=0;
	for (int i = mid+1; i <=hig; i++) {
		sum += num[i];
		if (sum > rmax)
			rmax = sum;
	}

	ans = lmax + rmax;
	if (lrev > ans) ans=lrev;
	if (rrev > ans) ans=rrev;
	return ans;



}

int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> num[i];
	}
	cout << cal(1, n);


}

借鉴了http://conw.net/archives/9/的代码(其实是复现
中间出了不少问题,一个错误debug了半小时(恼
在看到这个简洁的代码以后,不难理解为什么横跨分割点的时间复杂度是O(n)了,因为其实只是把全部元素遍历了一遍而已。
在线处理算法(动态规划)

#include
#include
#include
using namespace std;

int num[100001];


int main() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> num[i];
	}
	int tem=0,max = num[1];

	for (int i = 1; i <= n; i++) {
		tem += num[i];
		if (tem < 0)
			tem = 0;
		if (tem > max)
			max = tem;
	}
	cout << max;

}

你可能感兴趣的:(PTA练习,#,数据结构)