【最大矩阵和】最大加权矩形 rqnoj106
2012-11-06 18:39
676 查看
最大加权矩形rqnoj106
题目描述
给定一个正整数n( n<=100),然后输入一个N*N矩阵。求矩阵中最大加权矩形,即矩阵的每一个元素都有一权值,权值定义在整数集上。从中找一矩形,矩形大小无限制,是其中包含的所有元素的和最大 。矩阵的每个元素属于[-127,127]例:
0 –2 –7 0 在左下角: 9 2
9 2 –6 2 -4 1
-4 1 –4 1 -1 8
-1 8 0 –2 和为15
输入格式
第一行:n,接下来是n行n列的矩阵。输出格式
最大矩形(子矩阵)的和。样例输入
40 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出
15这一题可以说是前面 【贪心】旅游路线 那一题的升级版,这个是取一个矩形
同样,需要把所选的矩形压缩到一行,然后样最大子区间和来解决
我们需要一个sum[i][j]来存储第j列的前i行之和,比如样例中sum[3][2]=-2+2+1=1
分别枚举要取矩形的上边行数 i 和下边行数 j ,然后用sum[j][k]-sum[i-1][k]就是压缩到一行的第k列的值,然后就可以用递推来求出最大子区间和:用f[k]表示以 k 结尾的最大子区间和,记cc=sum[j][k]-sum[i-1][k],那么f[k]=max(f[i-1]+cc,cc);并同时找最大值
C++ Code
/* C++ Code http://blog.csdn.net/jiangzh7 */ #include<cstdio> #include<algorithm> using namespace std; #define MAXN 110 #define INF 0x7fffffff int n,a[MAXN][MAXN],sum[MAXN][MAXN];//sum[i][j]表示第j列前i行之和 int f[MAXN]; int main() { freopen("rqn106.in","r",stdin); freopen("rqn106.out","w",stdout); scanf("%d",&n); int i,j; for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&a[i][j]); for(i=1;i<=n;i++) for(j=1;j<=n;j++) sum[i][j]=sum[i-1][j]+a[i][j]; int k,maxx=-INF; for(i=1;i<=n;i++) for(j=i;j<=n;j++) for(k=1;k<=n;k++) { int cc=sum[j][k]-sum[i-1][k]; f[k]=max(f[k-1]+cc,cc); maxx>?=f[k]; } printf("%d",maxx); return 0; }
相关文章推荐
- rqnoj-106-最大加权矩形-dp
- rqnoj-106-最大加权矩形-dp
- 【rqnoj106】最大加权矩形(1418)
- 【解题报告】[动态规划] RQNOJ PID106 / 最大加权矩形
- 【最大矩阵和】最大加权矩形 rqnoj106
- 【RQNOJ PID106】最大加权矩形(DP)
- [LeetCode] 01矩阵中最大矩形 Maximal Rectangle
- 题目:最大加权矩形
- Maximal Rectangle, 求矩阵中最大矩形,参考上一题
- P1719最大加权矩阵
- poj 1050 To the Max 求矩阵中局部矩形区域和最大值
- HRBUST 1786 最大停车场 (01矩阵找最大的矩形)
- 柱状图中找最大矩形 & 矩阵中找最大的仅含相同值的矩形区域
- HDU_1505_矩阵中的最大矩形_dp
- 在01矩阵中找最大1矩形
- 【难】【DP】计算bool矩阵中,仅包含1的最大矩形和最大正方形
- 算法题:直方图和0-1矩阵中最大矩形
- P1719 最大加权矩形
- ACM Poj1050 To the Max 求矩阵中局部矩形区域和最大值 java版本
- 给定填充0和1的二维二进制矩阵,找到包含所有的最大矩形并返回其区域。