标签:
分治法一般分为三个步骤。
划分问题:把问题的实例划分为子问题。
递归求解:递归解决子问题。
合并问题:合并子问题的解得到原问题的解。
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