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

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

要求: n輸入一個二維整形陣列,數組裡有正數也有負數。

n二維陣列中連續的一個子矩陣組成一個子陣列,每個子陣列都有一個和。 n求所有子陣列的和的最大值。要求時間複雜度為O(n)。 組員:常嘯帆( 負責程式分析,程式碼程式設計),畢文強( 負責程式碼複審和程式碼測試計劃) 思路:對前幾天所做的返回一維陣列中最大子陣列的和進行改進,二維陣列求最大子陣列是從一維陣列擴充套件而來,只是多了一個變數,同時定義兩個變數,分析變數的範圍,然後從第一行開始確定最大子陣列範圍,把最大子陣列分成若干行,再用一維陣列求子陣列之和最大值的方法。依次求出最大值,依次比較,保留最大的。 實驗程式碼: #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; } 實驗結果:

 

實驗總結:本次實驗程式碼是參照之前同學們所做的成果,其中對他有個深刻的分析,明白了二維陣列是由一維陣列發展而來的,那麼思路就是想方設法的把二維陣列化為一維陣列或者類似於一維陣列的解決辦法來實現我們的目的。