1. 程式人生 > >返回一個二維數整陣列中最大子陣列的和

返回一個二維數整陣列中最大子陣列的和

題目:返回一個二維整數陣列中最大子陣列的和 

要求: n輸入一個二維整形陣列,數組裡有正數也有負數。 n二維陣列中連續的一個子矩陣組成一個子陣列,每個子陣列都有一個和。 n求所有子陣列的和的最大值。要求時間複雜度為O(n)。 組員:張子陽:責程式分析,程式碼程式設計。馬世傑:程式碼複審和測試。

 

思路:結合上一次程式設計的情況,我們想二維陣列和一位陣列求最大子陣列有什麼聯絡嗎?我們想,可以把每行求和,然後再把每行的和看成一個一維陣列,再按照一維陣列求最大子陣列的和的方法就可以解決這個問題了。

程式碼:

#include<iostream>
using namespace std;
void main ()
{
    int x,y,i,j,n=0,A[100][100];
 
    cout<<"輸入矩陣的行()和列";
    cin>>x>>y;
    if(x>100||y>100)
    {
        cout<<"請重新輸入:";
        cin>>x>>y;
    }
    for(i=0;i<x;i++)
    {
        for(j=0;j<y;j++)
        {
            cin>>A[i][j];
        }
 
    }
    int sum[100]={0},max=0,result=A[0][0];
 
    for(i=0;i<x;i++)//確定子陣列的最大上界(為第i行)
    {
        while(n+i<x)//確定子陣列有m+i行
        {
            //把子陣列當成一位陣列一樣,求最大子陣列的和
            for(j=0;j<y;j++)
            {
                sum[j]=sum[j]+A[n+i][j];
 
            }
            max=0;
            for(j=0;j<y;j++)
            {
                if(max+sum[j]>sum[j])
                {
                    max=max+sum[j];
                }
                else
                {
                    max=sum[j];
                }
                if(max>result)
                {
                    result=max;
                }
            }
            n++;//是子陣列的行數+1
        }
        //初始化m和sum[]的值,使子陣列最大上界下降1,之後重新迴圈。
        n=0;
        for(j=0;j<y;j++)
        {
            sum[j]=0;
        }
 
    }
 
    cout<<result;
}

 

總結

在這次任務中,我們首先想到了是不是可以根據一維陣列來進行二維陣列的最大子陣列求和,然後我們也在網上查了一些別人做的,最後我們才做出了這個程式,遇到的問題還是之前學的c語言太淺,而且大一學的現在基本上都忘了,基礎不好,上網看著別人做的自己百度,最終才做出這個程式。最後附上我們的工作照。