首页 > 其他 > 详细

最大子序列和问题

时间:2018-05-17 21:06:27      阅读:207      评论:0      收藏:0      [点我收藏+]

问题描述:

给定一整数序列A1, A2,... ,An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大。

解决办法:

分治法:最大子序列和可能出现在三个地方:整个出现在输入数据的左半部分,整个出现在输入数据的右半部分,或者跨越输入数据的中部从而占据左右两个半部分。

 1 double max3(double a, double b, double c){
 2     int d;
 3     d = (a > b) ? a : b;
 4     return (d > c) ? d : c;
 5 }
 6 
 7 int MaxSubSum(const int A[], int left, int right){
 8     int center = 0;
 9     int maxleftsum = 0, maxrightsum = 0;
10     int leftbordersum = 0, rightbordersum = 0;
11     int maxleftbordersum = 0, maxrightbordersum = 0;
12 
13     if(left == right)
14         if(A[left] > 0)
15             return A[left];
16         else
17             return 0;
18     else
19         ;
20 
21     center = (left + right) / 2;
22     maxleftsum = MaxSubSum(A, left, center);
23     maxrightsum = MaxSubSum(A, center + 1, right);
24 
25     for(int i = center; i >= left; i--){
26         leftbordersum += A[i];
27         if(leftbordersum > maxleftbordersum)
28             maxleftbordersum = leftbordersum;
29     }
30 
31     for(int i = center + 1; i <= right; i++){
32             rightbordersum += A[i];
33             if(rightbordersum > maxrightbordersum)
34                 maxrightbordersum = rightbordersum;
35     }
36 
37     return max3(maxleftsum, maxrightsum, maxleftbordersum + maxrightbordersum);
38 }
39 
40 int MaxSubsequenceSum(const int A[], int N){
41     return MaxSubSum(A, 0, N - 1);
42 }

动态规划:

 

最大子序列和问题

原文:https://www.cnblogs.com/longlively/p/9053110.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!