首页 > 代码库 > 分治算法求解序列最大子和问题
分治算法求解序列最大子和问题
特别的,当序列所有整数均为负整数时,其最大子和为0。
1 #include <stdio.h> 2 3 int caluMaxSubSum(int *array, int left, int right); 4 5 int main() 6 { 7 int array[6] = {2, -2, 3, 1, -4, 2}; 8 int len_array = sizeof(array)/sizeof(array[0]); 9 int i = 0;10 int subsum = caluMaxSubSum(array, 0, len_array);11 for(i = 0; i < len_array; i++)12 {13 printf("%d ", array[i]);14 }15 16 printf("\n");17 //printf("最大子和是: ");18 printf("subsum = %d\n", subsum); 19 return 0;20 }21 22 int caluMaxSubSum(int *array, int left, int right)23 { 24 int sum = 0;25 if(left >= right)26 {27 if(array[left] > 0)28 {29 sum = array[left];30 }31 else32 { 33 sum = 0; 34 }35 }36 else37 {38 int center = (left + right)/2;39 int s1 = 0, s2 = 0;40 int lefts = 0, rights = 0;41 int i = 0;42 int leftsum = caluMaxSubSum(array, left, center);43 int rightsum = caluMaxSubSum(array, center + 1, right);44 for(i = center; i >= left; i--)45 {46 lefts += array[i];47 if(lefts > s1)48 {49 s1 = lefts;50 }51 }52 53 for(i = center + 1; i < right; i++)54 {55 rights += array[i];56 if(rights > s2)57 {58 s2 = rights;59 } 60 }61 62 sum = s1 + s2;63 if(sum < leftsum)64 {65 sum = leftsum;66 }67 if(sum < rightsum)68 {69 sum = rightsum;70 }71 }72 73 return sum;74 }
关键性的思路在哪里?
分治算法求解序列最大子和问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。