【 HDU1081 】 To The Max (最大子矩阵和)
题目链接 Problem - 1081
题意
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
求最大的子矩阵和。
题解
这题注意要多组输入输出。
方法1
我自己想的\(O(n^3)\)的算法比较烦:(为什么每次我想的都那么不正常)
前缀和s[i][j],表示(0,0)-(i,j)子矩阵的和。
子矩阵(i,j)-(k,l)的和就是s[k][l]-s[i][l]-s[k][j]+s[i][j]
枚举右下角(K,L),和左上角的行号i,那么s[k][l]-s[i][l]是固定的,要让s[k][j]-s[i][j]最小。
于是g[k][i]保存和最小的s[k][j]-s[i][j]且小于l的j。
方法2
看了别人的,突然觉得自己的真麻烦。
s[i][j]表示第i行的前j列的和。
枚举左右边界的列编号i,j,sum保存第i列到第j列从第k行往上连续的最大和。这个过程只需枚举k从1到n,只要之前的sum是正的就继续累加,否则sum=0再加:sum+=s[k][j]-s[k][i-1]。用sum更新ans即可。
代码
方法1
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define N 105
using namespace std;
int n,a[N][N],g[N][N],s[N][N],ans;
int main() {while(~scanf("%d",&n)){ans=-127;memset(g,0,sizeof g);memset(s,0,sizeof s);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&a[i][j]);for(int k=1;k<=n;k++)for(int l=1;l<=n;l++){s[k][l]=s[k-1][l]+s[k][l-1]-s[k-1][l-1]+a[k][l];for(int i=0;i<k;i++){int &j=g[k][i];ans=max(ans,s[k][l]-s[i][l]-s[k][j]+s[i][j]);if(s[k][j]-s[i][j]>s[k][l]-s[i][l])j=l;}}printf("%d\n",ans);}return 0;
}
方法2
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#define N 105
using namespace std;
int n,s[N][N],ans,sum;
int main() {while(~scanf("%d",&n)){memset(s,0,sizeof s);ans=-127;sum=0;for(int i=1,a;i<=n;i++)for(int j=1;j<=n;j++){scanf("%d",&a);s[i][j]=s[i][j-1]+a;}for(int i=1;i<=n;i++)for(int j=i;j<=n;j++)for(int k=1;k<=n;k++){if(k==1||sum<0)sum=0;sum+=s[k][j]-s[k][i-1];ans=max(ans,sum);}printf("%d\n",ans);}return 0;
}
【 HDU1081 】 To The Max (最大子矩阵和)相关推荐
- POJ 1050 To the Max (最大子矩阵和)
题目链接 题意:给定N*N的矩阵,求该矩阵中和最大的子矩阵的和. 题解:把二维转化成一维,算下就好了. #include <cstdio> #include <cstring> ...
- 动态规划详解 转自瞿老师的博客
目录 一.动态规划初探 1.递推 2.记忆化搜索 3.状态和状态转移 4.最优化原理和最优子结构 5.决策和无后效性 二.动态规 ...
- HDU1081:To The Max(最大子矩阵,线性DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1081 自己真够垃圾的,明明做过一维的这种题,但遇到二维的这种题目,竟然不会了,我也是服了(ps:猪啊). ...
- 动态规划——最大子矩阵(hdu1081)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 题目描述: 在一个给定的大矩阵中找一个小型的矩阵,使这个矩阵中的元素和最大 解题思路: 这道题 ...
- Bailian2766 最大子矩阵【最大子段和+DP】
最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 ...
- 51Nod-1051 最大子矩阵和【最大子段和+DP】
1051 最大子矩阵和 基准时间限制:2秒 空间限制:131072KB 分值:40难度:4级算法题 一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 例如 ...
- 求一个矩阵的最大子矩阵
#include <iostream> #include <string> #include <assert.h> #include <malloc.h> ...
- 最大子矩阵(降维处理)
题目描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的矩阵 0 -2 -7 0 9 2 -6 2 -4 1 - ...
- 带限制条件的最大子矩阵 - 牛客
链接:https://www.nowcoder.com/acm/contest/131/B 来源:牛客网 题目描述 矩阵 M 包含 R 行 C 列,第 i 行第 j 列的值为 Mi,j. 请寻找一个子 ...
- 软件工程——求二维数组所有子矩阵的和的最大值
题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 求所有子数组的和的最大值.要求时间复杂度为 ...
最新文章
- 谷歌BERT预训练源码解析(一):训练数据生成
- android 音乐播放器中播放模式的设计
- 线上使用zabbix报警脚本(含图片)
- [ZJOI2011]礼物
- Python实现将图片转字符画
- hdu 5785 Interesting(manacher+前缀和)
- 修改php上传限制 (phpmyadmin 限制)
- Java中多线程访问冲突的解决方式
- pmo与敏捷团队可以共存吗_匿名与问责制可以共存吗?
- 企业发文的红头文件_【红头文件写作格式】 公司红头文件格式范本
- BCDboot 命令行选项
- 实现省市区镇四级联动选择器(地址选择)
- centos7系统详细安装步骤
- 系统辨识与自适应控制matlab程序_杂志精选 | 自适应声反馈抑制技术及其应用
- Deeper引领WEB3.0世界:去中心化、 安全性和超高速率的统一
- excel日期怎么间隔填充_系列或相同日期的自动填充Excel日期
- 在线直播源码,VUE 获奖名单滚动显示的两种方式
- pmos低电平驱动_MOS管驱动电路总结
- 用 gcc生成静态库和动态库以及静态库和动态库的使用
- 项目经理应怎么利用人工智能?