二維整數數組中最大子數組的和


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

要求: n輸入一個二維整形數組,數組里有正數也有負數。
n二維數組中連續的一個子矩陣組成一個子數組,每個子數組都有一個和。
n求所有子數組的和的最大值。要求時間復雜度為O(n)。
組員:陳晨( 負責程序分析,代碼編程),王穎瑞( 負責代碼復審和代碼測試計划)
思路:二維數組求最大子數組是從一維數組擴展而來,首先確定了最大上界的情況下在第一行開始確定最大子數組范圍,對於規定好的最大子數組的范圍,把最大子數組按照一列有幾個數,分成幾種不同的行,對於以上產生的幾個數組,進行一維數組求子數組之和最大值的方法。依次求出最大值,依次比較,保留最大的。是最大上界下降重復以上步驟。

對於求二維數組的子數組之和,思路和求一維數組的相差不多,但需要分析更多的情況,我跟舍友討論之后,之后寫的。以下是我的思路:

   1.確定子數組的最大上界,從第一行依次向下,規定最大子數組的范圍。

   2.對於規定好的最大子數組的范圍,把最大子數組按照一列有幾個數,分成幾種不同的行。(如第一組只有一行,第二組有兩行等,列數和數組的列數相同)

   3.對於第二步產生的幾個數組,進行一維數組求子數組之和最大值的方法。依次求出最大值,依次比較,保留最大的

   4.使最大上界下降1,重新第2 、3、4步。

代碼:
#include<iostream>
using namespace std;
void main ()
{
int x,y,i,j,m=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(m+i<x)//確定子數組有m+i行
{
//把子數組當成一位數組一樣,求最大子數組的和
for(j=0;j<y;j++)
{
sum[j]=sum[j]+A[m+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;
}
}
m++;//是子數組的行數+1
}
//初始化m和sum[]的值,使子數組最大上界下降1,之后重新循環。
m=0;
for(j=0;j<y;j++)
{
sum[j]=0;
}

}

cout<<result;
}


截圖:

測試:

針對此次的程序主要進行了以下測試:

1.全負:輸出矩陣中最大的負數

2.僅有1個值:輸出本身

3.全為0:輸出0

4.僅有一行或一列:輸出正常

5.超出數組范圍:重新輸入(代碼限制)

總結:二維數組求最大子數組是從一維數組擴展而來,一維數組可用線性解決,對於二位數組本來的想法是以O(n)的時間復雜度實現可經過自己查閱資料和同學討論還是沒有想出解決方案,最后只能把結果做出為目標制定了如上的思路,本次的任務依然是結對開發在這次的的開發過程中我和陳晨同學分工明確也漸漸找到了結對開發的一些注意的事項,在工作中也會有不同的的看法比如在討論制定思路方面,我們面對意見不同時我們各自告訴對方自己的看法在分析誰的想法比較好這樣也解決了問題,結對開發中收獲了很多。

 工作照:


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com