給定一個整型數組,數組中的數組元素可能爲正也可能爲負值,求出該數組中元素連續相加的最大值。也就是求出和值最大的子數列。
比如給定一個數組 a【8】 = {1,-2,-5,3,8,-7,9,4},這個很顯然,
最大的和值爲a【3】+a【4】+a【5】+a【6】+a【7】 = 3+8+ -7+9+4=17 的值。
我想了最笨的方法:
就是把每個連續的子序列組合找出來,然後求出和值,然後挑出最大的就可以了。
我們可以用下圖演示一下:
下面是一段簡單測試代碼:
#include<stdio.h>
int findSub(int a[],int size);
void PRINT(int a[],int size);
int main()
{
int a[8]={1,-2,-5,3,8,-7,9,4};
PRINT(a,8);
int Max = findSub(a,8);
printf("MaxSub: %d\n",Max);
return 0;
}
void PRINT( int a[],int size)//數組打印
{
int i;
for(i=0;i<size;i++)
{
printf("%d / ",a[i]);
}
printf("\n");
}
int findSub(int a[],int size)
{
int i,j,max;
int sum ;
max = a[0];//初始假設max 是a【0】的值
for(i=0;i<size;i++)//從第一個開始*,**和後面的每一個組合爲一個子序列***
{
sum = a[i];//初始和值sum爲a【i】;
for(j=i+1;j<size;j++)//**i 以後的每一個**
{
sum += a[j];//和值累加
if(max < sum)//如果假設的max 小於 所求的 sum的值
max = sum;//max更改爲 sum的值
printf("i=%d: j=%d: sum=%d: max=%d: \n",i,j,sum,max);//輸出當前的i,j,sum,max
}
}
return max;//返回max值
}