最大子数组
2016-03-08 22:30
197 查看
最大子数列
才疏学浅,难免有错,望有心人指正
采用分治法,考虑数列a[low..high],则连续子数组a[i..j]有以下三种情况:1. 完全位于a[low..mid]中
2. 完全位于a[mid+1..high]中
3. 位于两者之间,跨越mid
1 和 2 为原问题的子问题,因此主要考虑第三种情况的解决办法,其有一个特点,即经过mid,因此可以分别进行有mid开始的左右搜索,找出左右最大值,然后相加即可
#include <stdio.h> #define infinity -10000 typedef struct pos { int low,high,sum; }*info; info crossingsub(int *a,int low,int high) //返回下标跨越中点的最大子数组的边界下标和最大子数组的和 { info pos; int leftsum=infinity,rightsum=infinity,sum1=0,sum2=0; int mid=(low+high)/2; int i,j; for(i=mid;i>=0;i--) { sum1=sum1+a[i]; if(sum1>leftsum) { leftsum=sum1; pos->low=i; } } for(j=mid+1;j<=high;j++) { sum2=sum2+a[j]; if(sum2>rightsum) { rightsum=sum2; pos->high=j; } } pos->sum=leftsum+rightsum; return pos; } info subarray(int *a,int low,int high) { info pos,pos1,pos2,pos3;int mid; if(high==low) { pos->low=low; pos->high=high; pos->sum=a[low]; return pos; } else { mid=(low+high)/2; int b[high],c[high]; pos1=subarray(a,low,mid); pos2=subarray(a,mid+1,high); pos3=crossingsub(a,low,high); if(pos1->sum>=pos2->sum && pos1->sum>=pos3->sum) return pos1; else if(pos2->sum>=pos1->sum&&pos2->sum>=pos3->sum) return pos2; else return pos3; } } int main() { int a[10]={13,-3,-25,20,-3,16,-23,18}; info pos; pos=subarray(a,0,7); printf("最大子数组的下标:%d,上标:%d,和为:%d",pos->low,pos->high,pos->sum); return 0; }
相关文章推荐
- 回调函数
- [logstash-input-http] 插件使用详解
- 一生一个博客够了
- 2016蓝桥杯假期任务之《连号区间数》
- 将android的adb命令工具作用于mac全局
- NSRunLoop和NSTimer
- URL之资源下载整理
- 离职风波
- 条件结构
- Oracle学习之段区块初步概念
- bootsrtap 主题元素
- 表单美化css
- exec: g++: not found
- TypeScript Declaration Merging(声明合并)
- 数据库分区分表以及读写分离
- IOS 知识大总结
- 数据存储之文件存储
- 字符串的全排列
- VS2015不能卸载解决方法
- 【0成本】上下班打卡、会议签到|超表案例