码迷,mamicode.com
首页 > 其他好文 > 详细

分治法求最大连续和。

时间:2015-06-14 09:19:42      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

分治法一般分为三个步骤。

划分问题把问题的实例划分为子问题。

递归求解:递归解决子问题。

合并问题:合并子问题的解得到原问题的解。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int maxn = 10000 + 5;
 7 
 8 int A[maxn];
 9 
10 int maxsum(int* A, int x, int y){        //返回数组在左闭右开区间[x,y)中的最大连续和
11     int v, L, R;
12     if(y - x == 1) return A[x];        //只有一个元素,直接返回 
13     int m = x + (y-x)/2;    //分治第一步:划分成[x,m)和[m,y)
14     int maxs = max(maxsum(A, x, m), maxsum(A, m, y));    //分治第二步: 递归求解
15     v = 0; L = A[m-1];    //分治第三步:合并(1)——从分界点开始往左的最大连续和L
16     for(int i = m-1; i >= x; i--) L = max(L, v += A[i]);
17     v = 0; R = A[m];    //分治第三步:合并(2)——从分界点开始往右的最大连续和R
18     for(int i = m; i < y; i++) R = max(R, v += A[i]);
19     return max(maxs, L+R);    //把子问题的解L和R比较 
20 }
21 
22 int main(){
23     int T, n;
24     scanf("%d", &T);
25     while(T--){
26         scanf("%d", &n);
27         for(int i = 0; i < n; i++){
28             scanf("%d", &A[i]);
29         }
30         int maxs = maxsum(A, 0, n);
31         printf("%d\n", maxs);
32     }
33 }

 

分治法求最大连续和。

标签:

原文地址:http://www.cnblogs.com/hsq666/p/4574553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!