题目1139:最大子矩阵
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:1332
解决:512
-
题目描述:
-
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵。
比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是15。
-
输入:
-
输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。
再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。
已知矩阵中整数的范围都在[-127, 127]。
-
输出:
-
测试数据可能有多组,对于每组测试数据,输出最大子矩阵的大小。
-
样例输入:
-
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
-
样例输出:
-
15
-
答疑:
- 解题遇到问题?分享解题心得?讨论本题请访问: http://t.jobdu.com/thread-7862-1-1.html
-
- 前两天刚做了一道给定N *M让求最大矩阵和的题,刚看到却还是没有头绪,看了看别人写的发现这个喝上一个基本一样,用每个点存储定点到这一点的矩阵的和,然后算最大矩阵和的时候用三个量,一个上界为第几行,一个代表下界为第几行,一的代表列数,外面两个循环是标记的上界和下界,里面的循环是标志到第几列。
-
- 还有就是输入输出,处理数据的过程中下表都从1开始可以解决很大的边界问题,因为开的全局,不用处理都是0也不用判断边界。
-
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<algorithm> #include<iostream> using namespace std; int map[105][105]; int dp(int n) { int max=-1000000;//先标记为最小 for(int i=1;i<=n;i++)//上界为第几行 { for(int j=i;j<=n;j++)//下界为第几行 { int sum=0,temp; for(int k=1;k<=n;k++)//第几列 { temp=map[j][k]-map[j][k-1]-map[i-1][k]+map[i-1][k-1]; if(sum>0) //此处和求最大子段和无异 sum+=temp; else sum=temp; if(sum>max) max=sum; } } } return max; } int main() { int n; while(scanf("%d",&n)!=EOF)//注意为多组样例输入 { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&map[i][j]); map[i][j]+=map[i-1][j]+map[i][j-1]-map[i-1][j-1];//用每一个点存储定点到这一点的矩阵和 } } int res=dp(n); printf("%d\n",res); } return 0; }