posts - 177,comments - 5,views - 81869

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 }
复制代码

 

posted on   mobileliker  阅读(370)  评论(0编辑  收藏  举报
编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 《HelloGitHub》第 106 期
· 数据库服务器 SQL Server 版本升级公告
· 深入理解Mybatis分库分表执行原理
· 使用 Dify + LLM 构建精确任务处理应用
< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示