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

返回一個二維整數數組中最大子數組的和的小程序

col 決心 方案 技術 pac sys image 問題 width

要求:

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

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

思路:根據上次寫的找一維數組中最大子數組的經驗,不妨把二維數組轉化為一維數組的形式先進行求和,再比較,選出最大的子數組。首先以第一行為上界,依次向下確定數組的最大範圍,把最大子數組按照一列有幾個數,分成幾種不同的行,對於產生數組的,進行一維數組求和計算並找出最大值。然後將上界下調一行,從第二行開始,依次向下確定數組最大範圍,重復以上步驟。

代碼如下:

#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++) { while(m+i<x) { 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++; } m=0; for(j=0;j<y;j++) { sum[j]=0; } } cout<<result; system("pause"); }

運行結果:

技術分享圖片

技術分享圖片

總結:這個方法有些類似枚舉法,就算是枚舉,它應當有按一定的規則進行,所以我們給它定制特點的選取數組方法。本次任務對於我和我的夥伴來說有很大的難度,我們一起探討思路探討了很久,彼此在決定方案的時候有一些分歧,在編寫程序的過程中也有一些矛盾,比如我們在時間上有一些不同步,比如我們在任務分配上有一些不同意見,比如我們在策略決定上有一些不同想法。但是我們有著同一個目的,同樣的解決問題的決心,也有著對彼此的寬容。最終我們完成了這項任務。

技術分享圖片

返回一個二維整數數組中最大子數組的和的小程序