问题描述
给定序列a [1],a [2],a [3] ...... a [n],您的工作是计算子序列的最大和。例如,给定(6,-1,5,4,-7),此序列中的最大和为6 +(-1)+ 5 + 4 = 14。
杭电1003道题实质就是求出最大子段和问题,在该篇文章中将给出求最大子段和的两种算法,分别是枚举法,动态规划算法.
一、枚举法
枚举是算法设计的最基本的方法,其基本思想是逐一列举问题所有情况,并根据问题的条件来检验哪些是问题的解。
1. 最大字段和的问题要求主要是求出一个字段,且该字段的和是最大的,而字段的主要元素就是首元素及尾元素.一一列举各种收尾元素可能组成的字段的情况,然后进行判断取出最大的字段和,即为最大字段和.
首先我们用双层for循环依次列举各种字段可能出现的情况.
1. public int maxsum(int a[ ], int n)
2. {
3. int sum=0; //sum为我们要求解的最终的最大子段和
4. int thissum; //thissum为以a[i]为首元素,以a[j]为尾元素的子段的和
5. int besti,bestj;//分别为最大子段的首元素及尾元素的位置
6. int i,j,k;
7. for(i=1;i<=n;i++)
8. for(j=i;j<=n;j++)
9. for(k=i;k<=j;k++)
10.