OpenJudge 2766 最大子矩阵

1.链接:

http://bailian.openjudge.cn/practice/2766

2.题目:

总Time Limit:
1000ms
Memory Limit:
65536kB
Description
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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。

Input
输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。
Output
输出最大子矩阵的大小。
Sample Input
4
0 -2 -7 0 9 2 -6 2
-4 1 -4  1 -1

8  0 -2
Sample Output
15
Source
翻译自 Greater New York 2001 的试题

3.思路:

拓展的最大字段和。先遍历行的所有可能情况k=1-n。然后计算k行的矩阵每列的和,转为一维,在用最大字段和的方法求最大。

4.代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4
 5 using namespace std;
 6
 7 int main()
 8 {
 9     //freopen("C://input.txt","r",stdin);
10
11     int i,j,k;
12
13     int n;
14     cin >> n;
15
16     int **arr_matrix = new int*[n];
17     for(i = 0; i < n; ++i) arr_matrix[i] = new int[n];
18
19
20     for(i = 0;i < n; ++i)
21     {
22         for(j = 0;j < n; ++j)
23         {
24             cin >> arr_matrix[i][j];
25         }
26     }
27
28     int *arr_temp = new int[n];
29
30     int *dp = new int[n];
31
32     int max_sum = arr_matrix[0][0];
33     for(k = 0; k < n; ++k)
34     {
35         memset(arr_temp,0,sizeof(int) * n);
36         for(j = 0; j < n; ++j)
37         {
38             for(i = 0; i < k; ++i) arr_temp[j] += arr_matrix[i][j];
39         }
40
41         for(i = k; i < n; ++i)
42         {
43             for(j = 0; j < n; ++j) arr_temp[j] += arr_matrix[i][j];
44
45             memset(dp,0,sizeof(int) * n);
46             dp[0] = arr_temp[0];
47             for(j = 1; j < n; ++j)
48             {
49                 dp[j] = ((dp[j - 1] + arr_temp[j]) > arr_temp[j]) ? (dp[j - 1] + arr_temp[j]) : arr_temp[j];
50                 if(max_sum < dp[j]) max_sum = dp[j];
51             }
52
53             for(j = 0; j < n; ++j) arr_temp[j] -= arr_matrix[i - k][j];
54         }
55     }
56
57     cout << max_sum << endl;
58
59     delete [] dp;
60
61     delete [] arr_temp;
62
63     for(i = 0; i < n; ++i) delete [] arr_matrix[i];
64     delete [] arr_matrix;
65
66     return 0;
67 }

OpenJudge 2766 最大子矩阵

时间: 2025-01-07 10:33:19

OpenJudge 2766 最大子矩阵的相关文章

noi openjudge 1768:最大子矩阵

http://noi.openjudge.cn/ch0406/1768/ 描述已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 09 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个整数,再从

动态规划 - OJ1768最大子矩阵

题目来源:http://noi.openjudge.cn/ch0206/1768/ 1768:最大子矩阵 总时间限制: 1000ms:内存限制: 65536kB 描述: 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵.比如,如下4 * 4的矩阵 0 -2 -7 09 2 -6 2-4 1 -4 1-1 8 0 -2 的最大子矩阵是 9 2-4 1-1 8 这个子矩阵的大小是15. 输入: 输入是一个N * N的矩阵.输入的第一行给出N

BZOJ 1084 最大子矩阵 终于过了

一开始看到这道题,由于觉得m <= 2, 所以觉得这是道水题,回去后想了一下.在晚上来机房的时候已经想出来了,但是我必须承认细节决定成败.远在一个小时前我就已经把算法的主体都写好了,但是就是一直WA,为什么就是各种粗心,真心想捏死自己.一个小时就这么白白浪费了.我希望明天的我能变得强大一点.在有了今日惨痛的教训之后. 这道题并不难.用d[i][j][k] 来表示状态.i表示第几行,j表示之前取了多少个矩阵,k表示上一行的状态.即上一行的矩阵取法.如果k == 0 那么没有一个矩阵延伸到上一行,如

[OpenJudge] 百练2754 八皇后

八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数.已经知道8皇后问题一共有92组解(即92个不同的皇后串).给出一个数b,要求输出第b个串.串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小. I

poj1050查找最大子矩阵和

题目: To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 48507   Accepted: 25662 Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater locate

Codevs 1159 最大全0子矩阵 悬线法!!!!

1159 最大全0子矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 在一个0,1方阵中找出其中最大的全0子矩阵,所谓最大是指O的个数最多. 输入描述 Input Description 输入文件第一行为整数N,其中1<=N<=2000,为方阵的大小,紧接着N行每行均有N个0或1,相邻两数间严格用一个空格隔开. 输出描述 Output Description 输出文件仅一行包含一个整数表示要求的最大的全零子矩阵中零的个数.

51nod 1051 求最大子矩阵和

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1051 1051 最大子矩阵和 基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如:3*3的矩阵: -1 3 -1 2 -1 3 -3 1 2 和最大的子矩阵是: 3 -1 -1 3 1 2 Input 第1行:M和N,中间用空格

2014子矩阵

题目描述 Description 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵的一个子矩阵.例如,下面左图中选取第 2.4 行和第 2.4.5 列交叉位置的元素得到一个 2*3 的子矩阵如右图所示. 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的. 矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和. 本题任务:给定一个 n 行 m 列的正整数矩阵,请你从这个矩阵中选出一个 r 行 c 列的 子矩阵,

BZOJ1084 [SCOI2005]最大子矩阵

Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767). Output 只有一行为k个子矩阵分值之和最大为多少. Sample Input 3 2 2 1 -3 2 3 -2 3 Sample Output 9 正解:DP 解题报告: 乍一看,感觉像是才