【编程之法】最大连续子数组和

来源:互联网 发布:python counter 升序 编辑:程序博客网 时间:2024/05/16 07:37

题目描述
给定一个整数数组,数组里可能有正数、负数和零。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值,并输出此子数组。例如,如果输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},那么输出为该子数组的和18,和该子数组3 10 -4 7 2。
动态规划(编程之美P40,动态规划算法改编)

  • currSum(i) = max{0, currSum(i-1)} + a[i];
  • 根据currSum以及maxSum的变化,确定子数组的开始和结束位置。
#include<iostream>#include<cstdio>#include<vector>using namespace std;int main(){    int begin = 0;  // 连续数组的起始和终止位置    int end = 0;    vector<int> v;    int tmp;    while(cin >> tmp)    {        v.push_back(tmp);    }    int currSum = 0;    int maxSum = v[0];    for(int i = 0; i < v.size(); ++i)    {        if(currSum >= 0)        {            currSum += v[i];        }        else        {            currSum = v[i];            begin = i;        }        if(currSum > maxSum)        {            maxSum = currSum;            end = i;        }    }    for(int i = begin; i <= end; ++i)    {        cout << v[i] << " ";    }    cout << endl;    cout << "MaxSum: " << maxSum;    return 0;}

运行结果
这里写图片描述

0 0
原创粉丝点击