分治法Devide-and 4000 -Conquer
2015-10-02 16:08
441 查看
分治算法一般分为3个步骤:
1.划分问题:把问题的实例划分为子问题
2.递归求解:递归解决子问题
3.合并问题:合并子问题的解得到原问题的解
最大连续和问题
#include<iostream>
using namespace std;
int maxsum(int* A, int x, int y){
int i, m, v, L, R, max;
if(y-x == 1) return A[x]; //只有一个元素,直接返回
m = x + (y-x) / 2; //分治第一步:划分成[x,m)和[m,y)
//分治第二步,递归求解
if(maxsum(A, x, m) > maxsum(A, m, y)){
max = maxsum(A, x, m);
}else{
max = maxsum(A, m, y);
}
//分治第三步:合并(1)----从分界点开始往左的最大连续和L
v = 0; L = A[m-1];
for(i = m-1; i >= x; i--){
v += A[i];
if(L < v){
L = v;
}
}
//分治第三步:合并(2)----从分界点开始往右的最大连续和R
v = 0; R = A[m];
for(i = m; i < y; i++){
v += A[i];
if(R < v){
R = v;
}
}
if(max > (L+R)){
return max;
}else{
return (L+R);
}
}
1.划分问题:把问题的实例划分为子问题
2.递归求解:递归解决子问题
3.合并问题:合并子问题的解得到原问题的解
最大连续和问题
#include<iostream>
using namespace std;
int maxsum(int* A, int x, int y){
int i, m, v, L, R, max;
if(y-x == 1) return A[x]; //只有一个元素,直接返回
m = x + (y-x) / 2; //分治第一步:划分成[x,m)和[m,y)
//分治第二步,递归求解
if(maxsum(A, x, m) > maxsum(A, m, y)){
max = maxsum(A, x, m);
}else{
max = maxsum(A, m, y);
}
//分治第三步:合并(1)----从分界点开始往左的最大连续和L
v = 0; L = A[m-1];
for(i = m-1; i >= x; i--){
v += A[i];
if(L < v){
L = v;
}
}
//分治第三步:合并(2)----从分界点开始往右的最大连续和R
v = 0; R = A[m];
for(i = m; i < y; i++){
v += A[i];
if(R < v){
R = v;
}
}
if(max > (L+R)){
return max;
}else{
return (L+R);
}
}
相关文章推荐
- 对分治算法的几点思考
- 关于“2”这个数字
- [Leetcode题解]004 Median of Two Sorted Arrays
- 分治法求最大连续和
- [BZOJ1492][NOI2007][斜率优化][动态凸包][DP][分治]货币兑换cash
- mergeSort
- HDU5269 ZYB loves Xor I(分治?解法)
- 算法时间复杂度----分治与递归
- 偷懒的小X(lazy)
- FFT 快速傅里叶变换 初探
- [PKU1655]Balancing Act
- HOJ 13348 Finding Lines 画直线最多点
- 算法小白总结(三)-----分治法&&棋盘覆盖问题
- 算法小白总结(四)-----分治法之排序问题
- poj 1007
- 五大常用算法之一:分治算法
- 分治算法——快速排序
- 快速排序
- [编程之美] PSet2.9 斐波那契数列
- 分治法(divide-and-conquer)