統計連續子數列的最值

給定一個整型數組,數組中的數組元素可能爲正也可能爲負值,求出該數組中元素連續相加的最大值。也就是求出和值最大的子數列。
比如給定一個數組 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值
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章