434
社区成员
发帖
与我相关
我的任务
分享
//三种情况:
//1. 最大字段和为左半段之和
//2. 最大字段和为右半段之和
//3. 最大字段和跨越左右
int solve(int left,int right)
{
if(left==right)
{
//子问题只有一个,大于0就返回该数
}
//左右分开
int sleft=solve(left,mid),int sright=solve(mid+1,right);
//向左
for(int i=mid;i>=left;i--)
{
//从中间向左累加得到最大值
}
for(int i=mid+1;i<=right;i++)
{
//从中间向右累加得到最大值
}
return;
}
1. 划分:O(1);
2. 求解子问题:子问题划分为规模为n/2的子问题,再归并,时间复杂度:2T(n/2);
3. 合并:O(nlongn)
分治法就是将大规模的问题划分为小问题,分而治之,最后再合并。在这个过程中时间复杂度可以大大减少。一般包括:
1. 分解子问题
2. 解决子问题
3. 合并子问题
三个步骤。