最大二维子区间和 (贪心+前缀和)
【题目描述】
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。
【题目链接】
http://noi.openjudge.cn/ch0406/1768/
【算法】
众所周知一维子区间最大值要如何求,那么为求二维子区间最大和可以枚举任意两行,这两行间的同一列的数之和可以看成是一维子区间的一个值,问题就转换成一维子区间的最大值。当然两行间同一列数的和可以由列前缀和之差构成,所以读入的时候构造的初始矩阵就为列前缀和矩阵。
【代码】
1 #include <bits/stdc++.h> 2 using namespace std; 3 int n,i,j,k,ans; 4 int a[200][200],b[200]; 5 int main() 6 { 7 cin>>n; 8 for(i=1;i<=n;i++) 9 for(j=1;j<=n;j++) 10 cin>>a[i][j],a[i][j]+=a[i-1][j]; 11 for(i=0;i<=n;i++) 12 for(j=i+1;j<=n;j++) { 13 int rec=0; 14 for(k=1;k<=n;k++) { 15 rec+=a[j][k]-a[i][k]; 16 if(rec<0) rec=0; 17 else ans=max(ans,rec); 18 } 19 } 20 cout<<ans; 21 return 0; 22 }