c/c++アルゴリズムの連続サブ配列の最大和を求める
整数配列で、配列には正数も負数もあります.配列の中で連続する1つ以上の整数は1つのサブ配列を構成して、各サブ配列はすべて1つの和があって、すべてのサブ配列の和の最大値を求めて、例えば入力する配列は1で、-2,3,10,-4,7,2,-5で、それでは最大のサブ配列は3,10,-4,7,2で、そのため出力はこのサブ数のグループのと18です
実現過程は少し面倒であるが,比較的理解しやすく,アルゴリズムの複雑さを犠牲にした.
要求時間複雑度がO(n)である場合.
int MaxSum(int* a,int n) { int sum = a[n-1]; int max = a[n-1]; for(int i=0;i { sum = sum + a[n-i-1]; if(a[n-i-1] >= 0) { if(max < sum) { max = sum ; } } if(sum < 0) { sum = a[n-i-1]; } } return max; }
void main() { int a[] = {1, -2, 3, 10, -4, 7, 2, -5}; int B[]={-22,-11,-3}; int max = MaxSum(a,8); cout< }
この2つの方法は、皆さんの意見を歓迎します.テストのデータが少ないので、バグがある可能性があります.指摘を歓迎します.
int MaxSum(int* a,int n)
{
int MaxSum=a[0];
int TempSum=0;
for (int i=0;i=0)
{
TempSum+=a[j];
}
else if (a[j]<0)
{
int tmpAJ=a[j];
for (int m=j;m=0)
{
TempSum+=a[j];
break;
}
}
if(tmpAJ<0)
ContinueAdd=false;
}
if (!ContinueAdd)
{
break;
}
}
if(TempSum>MaxSum)
MaxSum=TempSum;
}
return MaxSum;
}
int main()
{
//int A[]={1,-2,3,10,-4,7,2,-5};
int B[]={-11,-22,-3};
int temp=MaxSum(B,3);
cout<
}
実現過程は少し面倒であるが,比較的理解しやすく,アルゴリズムの複雑さを犠牲にした.
要求時間複雑度がO(n)である場合.
int MaxSum(int* a,int n) { int sum = a[n-1]; int max = a[n-1]; for(int i=0;i { sum = sum + a[n-i-1]; if(a[n-i-1] >= 0) { if(max < sum) { max = sum ; } } if(sum < 0) { sum = a[n-i-1]; } } return max; }
void main() { int a[] = {1, -2, 3, 10, -4, 7, 2, -5}; int B[]={-22,-11,-3}; int max = MaxSum(a,8); cout< }
この2つの方法は、皆さんの意見を歓迎します.テストのデータが少ないので、バグがある可能性があります.指摘を歓迎します.