动态规划——数组最大子数组和
2009-05-29 15:27
183 查看
问题描述:
给定一个整数数组a[0~n],求数组a的子数组,使其元素和为最大。
问题分析:
方法一:可以用普通的方法枚举所有的子数组,然后求出最大的子数组和,时间复杂度为O(n*n)。
方法二:问题描述符合动态规划最优子结构的要求。
设b[i]表示以a[i]结尾
的子数组的最大子段和,即:
b[i]=max{sum(a[j~k])},其中0<=j<=i,j<=k<=i。
因此对于数组a[0~n]的最大字段和为max{b[i]},其中0<=i<n。
在计算b[i]时,可以考虑以下三种情况:
1,b[i] = b[i-1]+a[i],当b[i-1]>0时,这时候的b[i]中包含a[i]。
2,b[i] = a[i],当b[i-1]<=0,这时候以a[i]重新作为b[i]的起点。
3,b[i]不包含a[i]的情况,这种情况在计算b[i]之前已经计算处结果,保存在b[0~i-1]中。最后计算max{b[i]}时会考虑到。
b[i] = max{ b[i-1]+a[i],a[i]}。
而数组a[0~n]则为max{b[i]}。
在实现时,可以省略数组b[i]。实现如下:
给定一个整数数组a[0~n],求数组a的子数组,使其元素和为最大。
问题分析:
方法一:可以用普通的方法枚举所有的子数组,然后求出最大的子数组和,时间复杂度为O(n*n)。
方法二:问题描述符合动态规划最优子结构的要求。
设b[i]表示以a[i]结尾
的子数组的最大子段和,即:
b[i]=max{sum(a[j~k])},其中0<=j<=i,j<=k<=i。
因此对于数组a[0~n]的最大字段和为max{b[i]},其中0<=i<n。
在计算b[i]时,可以考虑以下三种情况:
1,b[i] = b[i-1]+a[i],当b[i-1]>0时,这时候的b[i]中包含a[i]。
2,b[i] = a[i],当b[i-1]<=0,这时候以a[i]重新作为b[i]的起点。
3,b[i]不包含a[i]的情况,这种情况在计算b[i]之前已经计算处结果,保存在b[0~i-1]中。最后计算max{b[i]}时会考虑到。
b[i] = max{ b[i-1]+a[i],a[i]}。
而数组a[0~n]则为max{b[i]}。
在实现时,可以省略数组b[i]。实现如下:
1 #include <iostream> 2 using namespace std; 3 #define N 10 4 int max_sub_array(int &s,int &e,int * a) 5 { 6 int i=0; 7 int j =0; 8 int b,start,end; 9 int sum = 0; 10 sum = b = a[0]; 11 s = e = start = end = 0;//s和e是整个数组a[0~n]的最大子段的起末位置。start和end是数组a[0~i]的起末位置。 12 for(i = 1;i<N;i++) 13 { 14 if(b>0) 15 { 16 b = b + a[i]; 17 end = i; 18 } 19 else 20 { 21 b = a[i]; 22 start = end = i; 23 } 24 if(sum<b) 25 { 26 sum = b; 27 s = start; 28 e = end; 29 } 30 } 31 return sum; 32 } 33 int main() 34 { 35 int a ={31,-41,59,26,-53,58,97,-93,-23,84}; 36 int start,end; 37 int sum = max_sub_array(start,end,a); 38 cout << sum << " "<<start<< " "<<end<< endl; 39 }
相关文章推荐
- 51nod 1270 数组的最大代价 动态规划
- 动态规划[入门]2-循环数组最大子段和
- 最大子数组求法--动态规划
- 2.15——字数组之和的最大值(二维,动态规划)
- 《算法导论》学习笔记——最大子数组(分治策略,动态规划)
- 动态规划之最大子数组
- golang动态规划求解最大连续子数组和
- 计算子数组和最大(动态规划)
- [置顶] 【动态规划】求一维子数组的最大和
- 编程之美:2.14 求数组的子数组之和的最大值和最小值(动态规划)
- [动态规划]最大连续子数组和的四种算法
- 动态规划(4):求子数组最大和
- 最大子数组问题(动态规划)--【算法导论】
- 动态规划——数组最大子数组和
- 最大子数组之和(动态规划)
- 求最大子数组!!(动态规划)
- 求子数组最大和 (非连续)(动态规划)
- 动态规划 01背包 最大子数组和 最小路径 斐波那契数列
- 动态规划求解数组连续最大和
- 53例. Maximum Subarray(最大子数组和)会了动态规划再看看