【最大子矩阵和】51nod 1051 最大子矩阵和
来源:互联网 发布:java内部类的调用 编辑:程序博客网 时间:2024/04/30 04:31
Problem Desciption
一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。
例如:3*3的矩阵:
-1 3 -1
2 -1 3
-3 1 2
和最大的子矩阵是:
3 -1
-1 3
1 2
Input
第1行:M和N,中间用空格隔开(2 <= M,N <= 500)。
第2 - N + 1行:矩阵中的元素,每行M个数,中间用空格隔开。(-10^9 <= M[i] <= 10^9)
Output
输出和的最大值。如果所有数都是负数,就输出0。
Input示例
3 3
-1 3 -1
2 -1 3
-3 1 2
Output示例
7
思路:
感觉这个不是很好表达,和最大连续子段和,有点相似,子矩阵和,就相当于把两行之间的和看成一个数,然后向右,求最大连续子段和。
#include<bits/stdc++.h>using namespace std;#define inf 0x3f3f3f3fint main(){ int m, n, i, j; long long dp[505][505], num; while(~scanf("%d %d", &m, &n)) { memset(dp, 0, sizeof(dp)); for(i = 1; i <= n; i++)//预处理一下,让第i行的数,等于前i行数的和,这样一会儿求两行之间的和就很方便了 { for(j = 1; j <= m; j++) { scanf("%lld", &num); dp[i][j] = dp[i - 1][j] + num; } } long long ans = 0;//记录最大的子矩阵 for(i = 1; i <= n; i++) { for(j = i; j <= n; j++) { num = 0;//初始化 for(int k = 1; k <= m; k++) { //类似于求最大连续子段和 num += dp[j][k] - dp[i - 1][k];//两行之间的和 if(num < 0) num = 0;//如果小于0,后面只会更小,所以初始化为0 if(num > ans) ans = num;//更新 } } } printf("%lld\n", ans); }}
阅读全文
0 0
- 51nod 1051 最大子矩阵和
- 51nod 1051 最大子矩阵和
- 51nod 1051 最大子矩阵和
- 51Nod 1051 最大子矩阵和
- 51nod 1051 最大子矩阵和
- 51 nod 1051 最大子矩阵和
- 51nod 1051 最大子矩阵和
- 51nod 1051 最大子矩阵和
- 51nod-最大子矩阵和
- 【最大子矩阵和】51nod 1051 最大子矩阵和
- [51nod 1051 最大子矩阵和]前缀和+dp
- 51nod 1051 最大子矩阵和 (dp_good)
- 51nod 1051 最大子矩阵和 dp
- 51Nod-1051-最大子矩阵和
- 【51Nod】1051 - 最大子矩阵的和(dp)
- 51Nod--1051最大子矩阵和(DP入门)
- 51nod 1051 最大子矩阵和【dp】
- 51nod 1051 最大子矩阵和(基础dp)
- 在AVR单片机中关于数据方向寄存器(DDR)的注解与DDRA、DDRB、DDRC、DDRD的作用与使用
- css3(6)
- 反射机制
- 租房心经--教你如何租房子
- cocos2d-x V3.14.1更新日志
- 【最大子矩阵和】51nod 1051 最大子矩阵和
- 【C++】cin、cin.get(char)和getline()
- Java常犯错误top10
- Scala Basics
- Unity 控制摄像机旋转、放大、缩小
- 欧几里得算法详解
- ${pageContext.request.contextPath} JSP取得绝对路径
- spring使用注意事项
- JAVA正则表达式