1. 程式人生 > >最大子陣列和(一維和二維)

最大子陣列和(一維和二維)

經典演算法題。

【一維陣列】

一個有N個整數元素的一維陣列,最大連續的子陣列和是多少?

大致思路如下:首先定義一個變數儲存以某個元素結尾的最大陣列和。再定義一個變數儲存全域性的最大子陣列和。然後初始化,遍歷整個陣列,找出對應的值比較即可。

#include<stdio.h>

int max(int a,int b)
{
    if(a<b) return b;
    else return a;
}
int MAXARR(int *a,int len)
{
    int mend=a[0];
    int allmax=a[0];
    for(int i=1;i<len;i++)
    {
        mend=max(a[i],mend+a[i]);
        allmax=max(allmax,mend);
    }
    return allmax;
}

int main()
{
    int tar[]={-1,5,1,-1,4,-1,6};
    int len=7;
    int res=MAXARR(tar,len);
    printf("the result is %d",res);
}

【二維陣列】

基本思路:將二維轉換成一維,當確定一個矩陣的上下界a和c,然後即可把其中的每一列中的第a行和第c行之間的元素看成一個整體,然後利用一維陣列的思路做就可以了。

#include<stdio.h>

int max(int a,int b)
{
    if(a<b) return b;
    else return a;
}
int MAXARR(int *a,int len)
{
    int mend=a[0];
    int allmax=a[0];
    for(int i=1;i<len;i++)
    {
        mend=max(a[i],mend+a[i]);
        allmax=max(allmax,mend);
    }
    return allmax;
}
int MAXARR2(int a[][3],int n,int m)
{
    int last=a[0][0];
    int res;
    //printf("%d\n",last);
    for(int i=0;i<n;i++)
    {
        for(int j=i;j<n;j++)
        {
            int b[m];
            for(int k=0;k<m;k++)
            {
                for(int p=i;p<=j;p++)
                {
                    b[k]+=a[p][k];
                }
            }
            res=MAXARR(b,m);
            printf("%d\n",res);
            if(res>last)
            {
                last=res;
            }
        }
    }
    return last;
}

int main()
{
    int tar[][3]={{1,2,3},{3,-1,5},{5,-5,5},{4,-7,8}};
    int n=4;
    int m=3;
    int res=MAXARR2(tar,n,m);
    printf("the result is %d",res);
}