最大的子序列和问题
问题描述
最大的子序列和问题是一个很经典的问题,各种考试面试中也经常碰到。这问题的解决不难,关键是通过这个问题体会一些算法的思路,学习思考怎么解决问题。
问题是这样的:给定整数A1,A2,...,An(正负不限),Ai,...,Aj(1<=i<=j<=n)是其一个子序列,Sum为此子序列所有元素的和,对所有可能的i,j,求Sum的最大值。例如:对于输入-2,-1,11,3,5,-8,-2,9,-20,-3,5,18,-5,3,答案为23(从A11到A12)。
解决方法
方法一
最直接也最容易想到的办法(当然也就是最暴力的方法),就是求出所有子序列的和,然后找出最大的。按照这个思路写出的C++代码如下:代码中的 idx_ss_begin 和 idx_ss_end 分别指向子序列的开头和结尾。
int method1(const vector<int> & v)
{
int max = v[0];
int size = v.size();
for (int idx_ss_begin=0; idx_ss_begin<size; idx_ss_begin++) {
for (int idx_ss_end=idx_ss_begin; idx_ss_end<size; idx_ss_end++) {
int sum = v[idx_ss_begin];
for (int i=idx_ss_begin+1; i<idx_ss_end; i++) {
sum += v[i];