伪代码:
#include<iostream>
using namespace std;
int n;
int nums[10008];
int find_Max(int nums[],int left,int right)
{
if(left>=right) return nums[left];
// 只有一个数
int mid=(left+right)/2;
int Lnums_Max = left -> mid
int Rnums_Max = mid+1 -> right
//调用find_max 找出左右侧 最大字段和
// 情况1 2
int num1=0,lefts=0;
for(int i=mid-1;i>=left;i--)
{
//求左边最大字段和
}
int num2=0,rights=0;
for(int i=mid;i<=right;i++)
{
//求右边最大字段和
}
// num1+num2 即情况 3
// 比较1 2 3 的值 得最大字段和
return //返回最大字段和
}
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>nums[i]; //输入
cout<<find_Max(nums,0,n-1)<<endl; //输出
return 0;
}
算法的时间复杂度:
T(n)=2T(n/2)+O(n)
可知该算法的时间复杂度为O(nlogn)
体会和思考:
分治法可以将一个难以直接解决的大问题,划分成一些规模较小的子问题,分而破之,达到解决问题的目的。
分治算法有以下三步:
1. 将较大规模的问题分割成k个更小规模的子问题。2. 对这些子问题分别求解,不够小则再划分,直到问题规模足够小,很容易求出其解为止。3.将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解,即合并子问题。