1. 程式人生 > >連續子序列的最大和

連續子序列的最大和

分析: 每次都對前i-1項的最大和sum進行判斷,如果sum < 0;

則a[i] 肯定大於a[i] + sum的和,這時執行 sum = a[i],否則執行sum += a[i];

但是這時還並不知道max和sum誰更大,故執行

max = max > sum ? max : sum;

#include <bits/stdc++.h>
using namespace std;

int maxSum( vector<int>&b,int n);
int main()
{
  int tmp;
  vector<int> a;
  char ch;
  while (cin >> tmp)
  {
          a.push_back(tmp);
          if ((ch = getchar())== '\n')//遇到enter就結束
                  break;
  } //以上是為了給陣列賦值
int max = maxSum(a,a.size());
  cout << max;
  return 0;
}

int maxSum( vector<int>&b,int n)
{
  int max = b[0];
  int tmpMax = b[0];
   for(int i = 0; i < n; i++)
    {
      if(tmpMax > 0)
        tmpMax += b[i];  //如果前(i)項的和為正數,則加上
      else
        tmpMax = b[i];
      //到現在為止並不知道前 (i)項的和與前i項的和那個大
      max = max > tmpMax ? max : tmpMax;

    }
   return max;
}

另一個更精簡的程式碼

int MaxSubsequenceSum( const int A[ ], int N )
{
    int ThisSum, MaxSum;
    ThisSum = MaxSum = A[0];
    for(int j = 1; j < N; j++ )
    {
        ThisSum = (ThisSum+A[j]) > A[j] ? (ThisSum+A[j]) :A[j]; 
        MaxSum = MaxSum > ThisSum ? MaxSum : ThisSum;
    }
    return MaxSum;
}