1. 程式人生 > >求一個二維整數數組中最大子數組的和

求一個二維整數數組中最大子數組的和

pre 完成 編程 mes 列數 矩陣 n) 一個 str

技術分享圖片要求:

   輸入一個二維整形數組,數組裏有正數也有負數。

  二維數組中連續的一個子矩陣組成一個子數組,每個子數組都有一個和。

  求所有子數組的和的最大值。要求時間復雜度為O(n)。

  兩人結對完成編程任務。

  一人主要負責程序分析,代碼編程。 一人負責代碼復審和代碼測試計劃。

#include <iostream>
using namespace std;
#define M 1000
int A[M][M];
int AS[M][M];
inline int ArraySum(int s,int t,int i,int j)
{
    return AS[i][j]-AS[i][t-1]-AS[s-1][j]+AS[s-1][t-1];
}
int max(int a,int b)
{
    return(a>b?a:b);
}
int main()  
{  
    int m,n,i,j;
    cout<<"輸入數組的行數:";
    cin>>n;
    cout<<"輸入數組的列數:";
    cin>>m;
    cout<<"輸入一個二維整數數組:"<<endl;
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            cin>>A[i][j];
        }
    }  
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {
            AS[i][j]=A[i][j]+AS[i-1][j]+AS[i][j-1]-AS[i-1][j-1];
        }
    }
    int Max=A[0][0];
    for(int a=0;a<n;a++)
    {
        for(int c=a;c<n;c++)
        {    
            int IV=ArraySum(a,0,c,0);
            for(j=1;j<m;j++)
            {  
                IV=max(ArraySum(a,j,c,j),ArraySum(a,j,c,j)+IV);
                Max=max(IV,Max);
            }  
        }
    }
    cout<<"數組最大子數組之和為:"<<Max<<endl;
	system("pause");
}

  技術分享圖片

求一個二維整數數組中最大子數組的和