最大二维子区间和 (贪心+前缀和)

【题目描述】

    已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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 }

 

posted @ 2018-07-22 16:28  飞飞翔滴少年  阅读(718)  评论(0编辑  收藏  举报