大家好,我是三十三,第一次写博客,有什么考虑不周的,请广大同学多多指正。
作为一个计算机专业毛都不会的即将毕业狗,说实话,心里一点有一丝丝慌慌的。在即将毕业之际,自己还是想囤点货给自己贴贴金,有啥错误还望指出。
一、 实验目的及任务
分治法求解最大子数组问题
二、 实验环境
c++或java或Turbo c
三、 问题描述
Input : 一个数组
Output:最大连续子数组。
四、 编程任务
一个整数数组中的元素有正有负,在该数组中找出一个连续子数组,要求该连续子数组中各元素的和最大,这个连续子数组便被称作最大连续子数组。
五、 数据输入
随机产生1000以上的数据(有正有负),放入输入文件input.txt
六、 结果输出
比如数组{2,4,-7,5,2,-1,2,-4,3}的最大连续子数组为{5,2,-1,2},最大连续子数组的和为5+2-1+2=8。
七、 实验代码
public class Main {
/**
* @author 三十三
*/
public int[] fen(int[] a,int s,int e,String loc){
if(s==e){
int[] end1 = new int[]{a[s],s,s};
return end1;
}
int mid = (s+e)/2;
int[] l_list = fen(a,s,mid,"左");
int l_sum = l_list[0];
int[] r_list = fen(a,mid+1,e,"右");
int r_sum = r_list[0];
int[] mid_list = midMax(a, s, mid, e);
int mid_sum = mid_list[0];
System.out.println(l_sum+" "+r_sum+" "+mid_sum+" "+loc);
if(l_sum>r_sum&&l_sum>mid_sum){
return l_list;
}else if(r_sum>l_sum&&r_sum>mid_sum){
int[] endr = new int[]{r_sum,mid+1,e};
return r_list;
}else{
return mid_list;
}
}
public int[] midMax(int[] a,int s,int m,int e){
int sum = 0;
int l = 0;
int r = 0;
//System.out.println(s+" "+m+" "+e);
int left_sum = a[m];
l = m;
for(int i = m;i>=s;i--){
sum += a[i];
if(sum > left_sum){
l = i;
left_sum = sum;
}
}
sum = 0;
int right_sum = a[m+1];
r = m+1;
for(int i = m+1; i<=e;i++){
sum += a[i];
if(sum > right_sum){
r = i;
right_sum = sum;
}
}
int[] end = new int[]{left_sum+right_sum,l,r};
return end;
}
}
注:
把代码贴上之后才发现,自己代码水平果真拿不出手,虽然我是一个cs专业的学生,但是!你耐不住我菜啊。
哈哈哈哈哈