ホームページ  >  記事  >  バックエンド開発  >  連続部分列の最大和問題

連続部分列の最大和問題

巴扎黑
巴扎黑オリジナル
2016-12-01 09:53:421948ブラウズ

問題の説明: シーケンス a[1]、a[2]...a[n] が与えられた場合、その連続サブシーケンス内の要素の合計の最大値を見つけます
例: 6 -1 5 4 -7 このシーケンス最大の連続値を持つ 部分列の合計は 14 です
具体的な問題については、HDOJ 1003 TZU 1202 を参照してください
この問題は、「データ構造とアルゴリズムの解析 - C 言語の記述」(Weiss 著) 中国語版でも説明されています13 ページ (英語版は 18 ページ)。アルゴリズムのプログラムは 21 ページに記載されています。

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

私は次のようにアルゴリズムを書きました:

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

このとき、変数による初期化に異なる値が使用されるため、else キーワードを削除する必要があります。この本の例では、常に MaxSum が負でないことを確認できます。そして、私が書き直したアルゴリズムは、多くの場合、負の数の MaxSum を持ちます
私の acm プログラムは次のとおりです (上記の Web サイトはどちらも ac です):

#include <stdio.h>  
#include <limits.h>  
  
#define MAX 100000+100  
  
int main(void)  
{  
  int n;  
  int m;  
  int a[MAX];  
  int i,j;  
  int thisSum,maxSum;  
  int maxStart,maxEnd,thisStart;  
  
  scanf("%d",&n);  
  for(i = 1; i <= n; i++)  
    {  
      scanf("%d",&m);  
      for(maxStart=maxEnd=thisStart=thisSum=0,maxSum=INT_MIN,j = 0; j < m; j++)  
    {  
      scanf("%d",&a[j]);  
      thisSum += a[j];  
  
      if(thisSum > maxSum)  
        {  
          maxSum = thisSum;  
          maxStart = thisStart;  
          maxEnd = j;  
        }  
      if(thisSum < 0)  
        {  
          thisSum = 0;  
          thisStart = j+1;  
        }  
    }  
      if(i > 1)  
    printf("\n");  
      printf("Case %d:\n",i);  
      printf("%d %d %d\n",maxSum,maxStart+1,maxEnd+1);  
    }  
  return 0;  
}


プログラムの主要部分は依然として上記のアルゴリズムであり、ペア シーケンスを追加するだけです最初と最後のインデックス番号の処理。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。