崩 oj 1768 最大子矩阵
描述
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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。
输入
输入是一个N * N的矩阵。输入的第一行给出N (0 < N <= 100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127, 127]。
输出
输出最大子矩阵的大小。
=======================================================================================================================================================================================================================
刚拿到这道题的时候 一点思路也没有
所以....
我搜题解去了
(好吧...这样不好)
发现一种更有意思的东西
矩阵前缀和
在这里先简单点儿
--------------------------------------------
就在下面
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
(a:元素,sum:从a(1,1)到a(i,j)所有值的和,就是前缀和。)

边读入边求前缀和(sum),用这个公式来求:①+②+③-④ 得出sum(5,3)=a(5,3)+sum(4,2)+sum(5,2)-sum(4,2);
好像有点递推思想呢?
然后四重循环暴力枚举所有子矩阵,找到最大值!

公式:①-②-③+④,枚举出(2,2)到(5,3)的矩阵大小t=sum(5,3)-sum(5,1)-sum(1,3)+sum(1,1),更新最大值。
这时候 就稍稍有点思路了
以下是代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,b[110][110],a[110][110],maxn,q,w,e,r;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
scanf("%d",&a[i][j]);
b[i][j]= a[i][j] + b[i-1][j] + b[i][j-1] - b[i-1][j-1]; //算出1.1到i.j矩阵所有元素的和
}
for(q = 1;q <= n;++q)
for(w = 1;w <= n;++w)
for(e = 1;e <= q;++e)
for(r = 1;r <= w;++r)
{
maxn=max(maxn,b[q][w] + b[e-1][r-1] - b[q][r-1] - b[e-1][w]); //反向想 算出e.r到q.w之间矩阵的元素和 并和先已知的最大值比较 若比它大 就替换
printf("%d",maxn);
return 0;
}
无后效性:
每个位置上的元素是确定的 得到的矩阵的最大值不会影响元素的值
崩 oj 1768 最大子矩阵的更多相关文章
- NOI题库 1768最大子矩阵 题解
NOI题库 1768最大子矩阵 题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...
- 1768:最大子矩阵(NOIP2014初赛最后一题)
1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如 ...
- noi 1768 最大子矩阵
题目链接:http://noi.openjudge.cn/ch0206/1768/ 可能是数据修改了吧,O(n6)过不了了. 主要是在求一个矩阵的和时,重复计算了很多次. 矩阵首先压缩一下.在输入的时 ...
- [itint5]最大子矩阵和
http://www.itint5.com/oj/#39 最大子矩阵和,复杂度O(n^3).利用了最大子段和的方法. int maxRectSum(vector<vector<int> ...
- #DP# ----- OpenJudge最大子矩阵
OpenJudge 1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
- NOI 动态规划题集
noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- openjudge-NOI 2.6基本算法之动态规划 专题题解目录
1.1759 最长上升子序列 2.1768 最大子矩阵 3.1775 采药 4.1808 公共子序列 5.1944 吃糖果 6.1996 登山 7.2000 最长公共子上升序列 8.2718 移动路线 ...
- dp专练
dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...
随机推荐
- [PHP] 算法-二位有序数组中查找的PHP实现
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 1.二 ...
- java连接OPC之——Windows7 With SP1 网络OPC的DCOM配置
由于 OPC(OLE for Process Control)建立在 Microsoft 的 COM(COmponent Model)基础 上,并且 OPC 的远程通讯依赖 Microsoft 的 D ...
- 【RabbitMQ】2、心得总结,资料汇总
Spring AMQP中文文档 http://ju.outofmemory.cn/entry/320538 云栖社区 https://yq.aliyun.com/search?q=rabbitm ...
- 【Java基础】15、负数的二进制表示方法
在计算机中,负数以其正值的补码形式表达. 什么叫补码呢?这得从原码,反码说起. 原码:一个整数,按照绝对值大小转换成的二进制数,称为原码. 比如 00000000 00000000 00000000 ...
- HTML--SVG基础
一 SVG概述 SVG是Scalable Vector Graphics的缩写,即缩放式矢量图形; 优点: 1.使用编辑器即可编辑图形; 2.基于XML,SVG图形可以被很容易的搜索,脚本化和压缩; ...
- domOperation.js
// 可视宽高var ch = document.documentElement.clientHeightvar cw = document.documentElement.clientWidth / ...
- sql server:Monty Hall problem (蒙提霍尔问题)
--------------------------------------------------------------------- -- Auxiliry Table of Numbers 数 ...
- 用 JS 写 (轮播图 / 选项卡 / 滑动门)
页面中经常会用到各式各样的轮播图,今天贺贺为大家介绍一种常用的方法,对于JS我们需要举一反三,一种方法可以对多个轮播样式进行渲染. <head> <meta charset=&quo ...
- Sharepoint 2013 Gatherer 数据库的架构版本低于此 Gatherer 应用程序支持的向后兼容的最低架构版本
管理中心 ->升级和迁移 ->查看数据库状态 解决方法: 开始-运行(以管理员身份运行),输入如下命令. cd C:\Program Files\Common Files\Microso ...
- GDAL中GDALDataType中值与其在C++中数据类型对应
GDAL中的GDALDataType是一个枚举型,其中的值为: GDT_Unknown : 未知数据类型 GDT_Byte : 8bit正整型 (C++中对应unsigned char) GDT_UI ...