【蓝桥第二周】矩阵最大和
来源:互联网 发布:高斯朴素贝叶斯 数据 编辑:程序博客网 时间:2024/06/02 14:49
矩阵最大和
题目描述 Description
题目描述 Description
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
输入描述 Input Description第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数;输出描述 Output Description
样例输入 Sample Input
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出 Sample Output
15
[解题思路]
其实就是最大子数组的扩展,加多一个对行的控制即可,注意先相加map[i][j] += map[i - 1][j],方便用dp[k] = map[j][k] + map[i - 1][k],求出第k列i到j的和(看不懂的,或者不能理解的的,看代码,打表一行一行认真耐心看)。
[代码实现]
#include<stdio.h>using namespace std;#define N 110 int map[N][N],dp[N]; int main(){int i, j, k, x, y;scanf("%d%d", &x, &y); for(i = 1; i <= x; i ++) { for(j = 1; j <= y; j ++) { scanf("%d", &map[i][j]); map[i][j] += map[i - 1][j]; /* 若这里不相加,在计算i-1到j的和时,需要dp[k]=0; for(int m=i-1;m<=j;m++) dp[k] += map[m][k]; */ } } int MaxN = map[1][1]; for(i = 1; i <= x; i ++) /* i控制从第几行开始 */ { /* cout<<"————————————i——————————————————————"<<i; */ for(j = i; j <= x; j ++) /* j控制到第几行结束 */ { /* cout<<"————————————j——————————————————————"<<j; */ for(k = 1; k <= y; k ++) /* k控制列*/ { dp[k] = map[j][k] - map[i - 1][k]; /* d[k]为i-1到j的和 *//* cout<<d[k]<<endl */ if(dp[k - 1] > 0) /* 如果前一列之和大于0加上 */ dp[k] += dp[k - 1]; if(dp[k] > MaxN) MaxN = dp[k]; } } }printf("%d\n", MaxN); }
1 0
- 【蓝桥第二周】矩阵最大和
- 蓝桥 最大子矩阵
- 【蓝桥第二周】和尚挑水
- 【蓝桥第二周】01背包问题
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- NYOJ104最大矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大子矩阵和
- 最大矩阵子和
- 最大子矩阵和
- 最大矩阵和
- 最大子矩阵和
- linux 进程控制总结笔记
- (解题报告)HDU2005---第几天
- Android Studio放置jar跟os库的位置
- 字体图标兼容性,兼容IE
- 01.使用Charles抓包获取API
- 【蓝桥第二周】矩阵最大和
- Leetcode: Peeking Iterator
- 【日记-C语言】ACM读错题了q.q(题-码)
- (解题报告)HDU2006---求奇数的乘积
- 线段树
- Java——用户界面的布局
- BAYKEE app开发中遇到的一些问题和解决办法
- 用 Redis 实现分布式锁
- poj2479 Maximum sum