hdu 1081 To The Max

2014-11-24 09:11:18 · 作者: · 浏览: 0

给一个n^2矩阵 求一个和最大的子矩阵

先预处理行或者列的和 然后很好的转化成一维dp

这里我的 mp[i][j] 表示i行前j个数的和

dp的过程就是 枚举列的首尾

这样 相当于把每一行当成一个数 dp求最大和 就是一个简单的问题了


#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
          #define inf 0x3f3f3f3f #define ll __int64 int mp[105][105]; int main() { int n,a,i,j,k,tmp,ans; while(~scanf("%d",&n)) { memset(mp,0,sizeof mp); for(i=1;i<=n;i++) for(j=1;j<=n;j++) { scanf("%d",&a); mp[i][j]=(a+mp[i][j-1]); } ans=-99999999; for(i=1;i<=n;i++)//起始列 { for(j=i;j<=n;j++)//结束列 { for(tmp=0,k=1;k<=n;k++)//枚举高度 { if(tmp<0) tmp=0; tmp+=(mp[k][j]-mp[k][i-1]); if(tmp>ans) ans=tmp; } } } printf("%d\n",ans); } return 0; }