poj1050最大子矩陣和

這周準備狂做dp題,儘管目前還是很弱,但是自己給自己鼓勁吧,每天做好的題目最好都能寫寫解題報告,雖然乍看起來,很是浪費時間,但是還是養成一個習慣吧!爲後面更多的難題做準備!

 此題爲dp第5題,poj1050,

 // b[i][j]表示從1...i行,第j列的和
     /*在這裏其實只要壓縮數組就行了,那麼如何壓縮呢,b[i][j]-b[k][j]   1<=k<=i-1 此時對
     於每個k,都有相應的j列組成一個數組,在這個數組裏,在用一維的求最大值即可
    
      我們要做的就是要循環k次,其中對於這每一個k,總共有j列,其中k又有從1...i-1種可能,
      而i的取值範圍又是 從1...n   初始的時候,其中s[0][j] 對於0行的沒個j列都爲0
     
      那麼這個循環可以這樣寫:
      for(int i=1;i<=n;i++)
       for(int k=1;k<=i-1;k++)
        {
          sum=0;
          for(int j=1;j<=n;j++)
         {
           sum+=(b[i][j]-b[k][j]);
           if(sum>max)
           max=sum;
           if(sum<0)
           sum=0;
         }
        }
*/
#include<iostream>
#include<string>
#define minest -100000
using namespace std;
int main()
{
  int n;
  int a[102][102];
  int b[102][102];
  int sum,maxsum;
  cin>>n;
  for(int i=1;i<=n;i++)
   for(int j=1;j<=n;j++)
    cin>>a[i][j];
    memset(b,0,sizeof(b));
    for(int i=1;i<=n;i++)
     for(int j=1;j<=n;j++)
       for(int k=1;k<=i;k++)
         b[i][j]+=a[k][j];       
    maxsum=minest;
    for(int i=1;i<=n;i++)
       for(int k=1;k<=i-1;k++)
        {
          sum=0;
          for(int j=1;j<=n;j++)
         {
           sum+=(b[i][j]-b[k][j]);
           if(sum>maxsum)
           maxsum=sum;
           if(sum<0)
           sum=0;
         }
        }
  cout<<maxsum<<endl;
  //system("pause");
}

發佈了37 篇原創文章 · 獲贊 1 · 訪問量 205萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章