数组最大子序列和
2012-12-01 14:54
190 查看
// 数组的最大子序列和: // 连续的子数组,和为最大。 //设sum[i] 为前i个元素中,包含第i个元素且和最大的连续子数组, //result 为已找到的子数组中和最大的。 //对第i+1个元素有两种选择:做为新子数组的第一个元素、放入前面找到的子数组。 //sum[i+1] = max(a[i+1], sum[i] + a[i+1]) //result = max(result, sum[i]) #include <iostream> using namespace std; #include <iterator> int maxsum(int ap[], int n, int &a, int &b) { int max=ap[0]; int sum=ap[0]; int p1=0, p2=0; for(int j=1;j<n;j++) { if(sum<0) { sum=ap[j]; p1=p2=j; } else { sum+=ap[j]; p2=j; } if(sum>max) { max=sum; a=p1; b=p2; } } return max; } int main() { int ap[]={-1, -2, 3, 10, -4, 7, 2, -5}; int ap2[]={-91, -2, -3, -10, -4, -7, -2, -5}; int a,b; copy(ap,ap+8,ostream_iterator<int>(cout," ")); cout<<endl<<"maxsum:"<<maxsum(ap, 8,a,b)<<endl; copy(ap+a,ap+b+1,ostream_iterator<int>(cout," ")); cout<<endl<<endl; copy(ap2,ap2+8,ostream_iterator<int>(cout," ")); cout<<endl<<"maxsum:"<<maxsum(ap2, 8,a,b)<<endl; copy(ap2+a,ap2+b+1,ostream_iterator<int>(cout," ")); cout<<endl<<endl; return 0; }
思路:记录sum的值,sum依次统计序列元素的和,如果sum<0,则丢弃之前的sum值,采用新的值sum=p[i]。
DP递推时,需要比较sum与最大值max,取其较大者。
相关文章推荐
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 小代码 bug数组之最大升序列
- 求数组最大子序列的和
- 11.27交换数组、获取二进制序列的奇偶位并输出、从大到小输出三个数、求最大公约数。
- 寻找数组中和最大的子序列
- 数组的最大子序列和
- 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和
- 一个整数数组(正负,0),找出这个数组的最大子序列
- 数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串
- 1.将数组A中的内容和数组B中的内容进行交换。(数组一样大) 2.获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。 3.将三个数按从大到小输出。 4.求两个数的最大公约数。
- (C#)找出数组中最大子序列之和,分别以O(N^2),O(NlogN),O(N) 这3种时间复杂度求解
- 求数组(元素可为正数、负数、0)的最大子序列和
- 数组连续子序列的最大和&最大积
- 求一个数组的最大子序列
- 数组连续子序列的最大的和-四种算法,四种时间复杂度
- 求数组(元素可为正数、负数、0)的最大子序列和,
- 求数组(元素可为正数、负数、0)的最大子序列和。
- Post Tagged 【dp】最大子数组和(最大子序列和 | 连续子数组最大和)
- 最大子数组之和、最大子数组之积、最长递增子序列求法
- ] 找工作知识储备(2)---数组字符串那些经典算法:最大子序列和,最长递增子序列,最长公共子串,最长公共子序列,字符串编辑距离,最长不重复子串,最长回文子串