蓝桥杯 最大子阵_dp
来源:互联网 发布:2016年达内java百度云 编辑:程序博客网 时间:2024/06/05 10:25
历届试题 最大子阵
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。
其中,A的子矩阵指在A中行和列均连续的一块。
其中,A的子矩阵指在A中行和列均连续的一块。
输入格式
输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
接下来n行,每行m个整数,表示矩阵A。
接下来n行,每行m个整数,表示矩阵A。
输出格式
输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
3 3
-1 -4 3
3 4 -1
-5 -2 8
-1 -4 3
3 4 -1
-5 -2 8
样例输出
10
样例说明
取最后一列,和为10。
数据规模和约定
对于50%的数据,1<=n, m<=50;
对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
枚举最大子阵的开始行和结束行,对应开始行和结束行内在一列的所有元素加和,形成一个一维数组,求所有这样一维数组的最大子段和的最大值,即为答案。
#include <iostream>#include <stdio.h>#define N 510#define INF 0x3f3f3f3fusing namespace std;int n, m;int map[N][N];int sum[N][N];int mymax(int *p){ int b = 0, max = -INF; for (int i = 0; i < m; i++) { b += p[i]; if (b > max) max = b; if (b < 0) b = 0; } return max;}int main(){ scanf("%d%d", &n, &m); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { scanf("%d", &map[i][j]); if (i - 1 < 0) sum[i][j] = map[0][j]; else sum[i][j] = sum[i - 1][j] + map[i][j]; } } int max = -INF; for (int i = 0; i < n; i++) { for (int j = i; j < n; j++) { int temp[N]; for (int k = 0; k < m; k++) { if (i - 1 < 0) temp[k] = sum[j][k]; else temp[k] = sum[j][k] - sum[i - 1][k]; } int res = mymax(temp); if (res > max) max = res; } } printf("%d\n", max); return 0;}
0 0
- 蓝桥杯 最大子阵_dp
- POJ1050_To the Max_求最大子矩阵_DP
- 洛谷 1115_最大子段和_dp?
- 盖房子_DP
- 最大子阵 蓝桥杯
- 蓝桥杯---最大子阵
- 蓝桥杯:最大子阵
- 蓝桥杯-最大子阵
- 最大子阵 --蓝桥杯
- 蓝桥杯最大子阵
- 蓝桥杯-最大子阵
- 2017河工大邀请赛G题_1266: 最大子段和_Dp
- 最长公共子序列_DP
- 蓝桥杯 最大子阵(dp最大子段和)
- 蓝桥杯 最大子阵 (DP)
- 蓝桥杯 历届试题 最大子阵
- 蓝桥杯 历届试题 最大子阵
- 蓝桥杯 -- 历届试题 最大子阵 【DP】
- JAVASE_正则表达式
- [Java] 东南大学人文讲座信息爬虫
- java数据引擎(二):详细使用
- HorizontalScrollView
- Lucene 使用(一)简介
- 蓝桥杯 最大子阵_dp
- Oracle 语法基础
- 今天碰到@WebServlet错误
- 小白也刷题--leetcode求两链表的交集
- CentOS 7 中在配置文件中修改 mariadb的字符编码
- hdu 1299
- Java程序逻辑-1
- 最少步数
- Strange fuction