分治法之最大子数组问题
2016-04-09 14:45
369 查看
自己敲出来的,先把代码贴上来,晚上有时间再写总结
#include<stdio.h> #define N 10 struct Max{ int low; int high; int sum; }; int a ; Max Findcrossing(int* a,int low,int middle,int high); Max FindSub(int* a,int low,int high); int main() { Max m; int i; for(i=0;i<N;i++) scanf("%d",&a[i]); m=FindSub(a,0,9); printf("%d\n%d\n%d",m.sum,m.low,m.high); return 0; } Max FindSub(int* a,int low,int high) { Max max_sub; Max max_left; Max max_right; Max max_cross; if(high==low) { max_sub.high=high; max_sub.low=low; max_sub.sum=a[low]; } else { int middle=(low+high)/2; max_left=FindSub(a,low,middle); max_right=FindSub(a,middle+1,high); max_cross=Findcrossing(a,low,middle,high); if(max_left.sum>=max_right.sum&&max_left.sum>=max_cross.sum) { max_sub.high=max_left.high; max_sub.low=max_left.low; max_sub.sum=max_left.sum; } else if(max_right.sum>=max_left.sum&&max_right.sum>=max_cross.sum) { max_sub.high=max_right.high; max_sub.low=max_right.low; max_sub.sum=max_right.sum; } else { max_sub.high=max_cross.high; max_sub.low=max_cross.low; max_sub.sum=max_cross.sum; } } return max_sub; } Max Findcrossing(int* a,int low,int middle,int high) { int i,j; Max max_cross; int left_i,sum_left=0,MAX_left=-10000; for(i=middle;i>=low;i--) { sum_left+=a[i]; if(sum_left>MAX_left) { MAX_left=sum_left; left_i=i; } } int right_j,sum_right=0,MAX_right=-10000; for(j=middle+1;j<=high;j++) { sum_right+=a[j]; if(sum_right>MAX_right) { MAX_right=sum_right; right_j=j; } } max_cross.sum=MAX_left+MAX_right; max_cross.low=left_i; max_cross.high=right_j; return max_cross; }
相关文章推荐
- [IO]——重定向
- 深入理解javascript原型和闭包系列 深入理解javascript原型和闭包(13)-【作用域】和【上下文环境】
- Linux安装ftp组件
- 比特币0.9.2中文版编译手册
- c# Linq Lamda表达式使用 GroupBy 分组
- 网页设计必不可少的控件
- 指针函数与函数指针--两个简单例子进行说明
- [Unity游戏开发]向量在游戏开发中的应用(三)
- 《深入理解计算机系统》第七章学习笔记
- HTML概述
- Java基础之——泛型(一)
- UVA-12108 Extraordinarily Tired Students
- Xshell Solarized Dark主题
- 身份证验证
- mybatis中的配置及mysql的特有语句
- Java多线程学习(总结)
- Java作为一门编程语言,最好的学习方法就是写代码
- centos7 改变默认启动方式
- 2016.4.9
- CoreData