434
社区成员
发帖
与我相关
我的任务
分享一、分治算法计算最大子段和:
情况1:最大子段和在左半部分。
情况2;最大子段和在右半部分。
情况3:最大子段和在左右两边都有。
#include <iostream>
using namespace std;
int n;
int a[501];
int maxSum(int left, int right) {
if(left == right) return a[left];
int mid = left + (right - left) / 2;
int lmax = maxSum(left, mid);
int rmax = maxSum(mid+1, right);
int clmax = a[mid];
int tmp = a[mid];
for(int i = mid-1; i >= left; i--){
tmp += a[i];
if(tmp > clmax) clmax = tmp;
}
int crmax = a[mid+1];
tmp = a[mid+1];
for(int i = mid + 2; i <= right; i++){
tmp += a[i];
if(tmp > crmax) crmax = tmp;
}
int cmax = clmax + crmax;
int maxs = max(max(lmax, rmax), cmax);
if(maxs < 0) maxs =0;
return maxs;
}
int main() {
cin >> n;
for(int i=1; i<=n; i++){
cin >> a[i];
}
cout << maxSum(1, n) <<endl;
return 0;
}
二、分析时间复杂度
通过分治算法把原问题分为两个子问题,规模为原来的1/2.
T(n) = O(1) + 2T(n/2) + O(n)
2T(n/2) = n^log2 2=O(n)
所以T(n) = (nlogn)
三、体会与思考
分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立而且与原问题相同。再通过递归解子问题,再合并得到原问题解。分治算法可以帮助我们更快,使用更小的空间去解决问题,这也为我们解决问题提供了一种新的思路!