NOI题库 1768最大子矩阵  题解
 
 
总时间限制: 1000ms 内存限制: 65536kB
 
描述
 
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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]。
 
输出
 
输出最大子矩阵的大小。
 
样例输入
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
 
样例输出
15
 
 
———————————————————————————————————————
 
 
分析
最初看到这道题时,我完全不知道怎么DP,只能想到暴力算法,这道题的最暴力想法就是枚举,但是这个想法的时间复杂度达到O(N^4),当数据较大时无法承受,经大神指点得知,可以使用动态规划解决这个问题。那么,怎么用动态规划呢?
最初学DP时,有一个求最大子段和的问题,可以通过DP解决,最大子矩阵只是最大子段和在二维中的扩展,为了能继续使用这种方法,我们需要将这个矩阵降维处理,降维操作如下图:
 
这是样例中4*4的矩阵,红色框中是进行降维操作的矩阵

 
 
 降维的操作很简单,只需要将同一列的加和,就能得到目标序列,我们可以使用前缀和思想来优化这个操作。
 
通过这个操作可以将二维矩阵降维,随后就可以用区间DP的方法解决这个最大子矩阵的问题。
 
代码如下:

 #include "cstdio"
#include "cstring"
#include "algorithm"
#include "cmath"
using namespace std ; int gmax( int a , int b)//求最大值
{
return a > b ? a : b ;
} int best[], temp[]; int tmp[][], pr[][]; void Init ( int n )
{
for( int i = ; i <= n ; ++i )pr[][i] = tmp[][i] ;//pr[]数组用前缀和思想
for(int i = ; i <= n ; ++i )
for (int j = ; j <= n ; ++j )
pr[i][j] = pr[i - ][j] + tmp[i][j] ;//计算前缀和
return ;
} int solve ( int *a , int N)
{ memset ( best , , sizeof(best));//best数组表示以i为结尾的最大子序列和
int ans = - ;
for ( int i = ; i <= N ; ++i)
{
if ( best[i - ] + a[i] > a[i])
{
best[i] = best[i - ] + a[i] ;//DP方程
}
else
{
best[i] = a[i] ;//DP方程
}
}
for ( int i = ; i <= N ; ++i )ans = gmax( ans , best[i]);//求出best数组中的最大值,即最大子序列和
return ans ;
} int main ( )
{
int ans = - , n;
scanf("%d", &n);
for(int i = ; i <= n ; ++i )
{
for (int j = ; j <= n ; ++j )
{
scanf("%d", &tmp[i][j]);
}
}
Init ( n );//预处理
for ( int i = ; i <= n ; ++i)
{
for ( int j = i ; j <= n ; ++j )
{
memset( temp , , sizeof(temp));
for ( int k = ; k <= n ; ++k )
{
temp[k] = pr[j][k] - pr[i - ][k];//temp数组是降维后的数组
}
ans = gmax(solve ( temp , n) , ans );//求出最大值
}
}
printf("%d\n", ans);
return ;
}
——————————————————————————————————————
(完)
 

NOI题库 1768最大子矩阵 题解的更多相关文章

  1. NOI题库刷题日志 (贪心篇题解)

    这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制:  1000ms  内存限制:  65536kB 描述 在一个平面上,如果有两个点( ...

  2. NOI题库 09:图像旋转翻转变换

    NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...

  3. NOI题库-小学奥赛QwQ

    今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...

  4. NOI 题库 9272 题解

    9272   偶数个数字3 描述 在所有的N位数中,有多少个数中有偶数个数字3? 输入 一行给出数字N,N<=1000 输出 如题 样例输入 2 样例输出 73 Solution : 令f ( ...

  5. NOI 题库 8471 题解

    8471   切割回文 描述 阿福最近对回文串产生了非常浓厚的兴趣. 如果一个字符串从左往右看和从右往左看完全相同的话,那么就认为这个串是一个回文串.例如,“abcaacba”是一个回文串,“abca ...

  6. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35

    T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...

  7. noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30

    T21:单词替换 描述 输入一个字符串,以回车结束(字符串长度<=100).该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写.现需要将其中的某个单词替换成另一个单词,并输出替 ...

  8. NOI题库192 生日蛋糕

    192:生日蛋糕 总时间限制: 5000ms 内存限制: 65536kB 描述 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i ...

  9. 数据排序 第三讲( 各种排序方法 结合noi题库1.10)

    说了那么多种排序方法了,下面就来先做几个题吧 06:整数奇偶排序 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 给定10个整数的序列,要求对其重新排序.排序 ...

随机推荐

  1. ora-01400 无法将NULL插入 ID 解决方法

    问题描述:由于工作原因,把部分 字段改了,大体这样 StatementCallback; uncategorized SQLException for SQL [insert into test(sc ...

  2. 关于Java反射机制的几个问题

    >>如何在运行时确定对象类型 运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式, 一种是在编译时和运行时已经知道了所有的类型,另外一种是 ...

  3. WIN10 新建ORACLE实例

    1 管理员身份进入CMD环境,执行DBCA命令,在弹出窗口的引导中,完成实例创建 2 如果在创建过程中没有选择适当的字符集(最好采用默认字符集),如下图所示,在进入PLSQL DEVELOPER的时候 ...

  4. WebStorm 有哪些过人之处?

    作者:方应杭链接:https://www.zhihu.com/question/20936155/answer/16654794来源:知乎著作权归作者所有,转载请联系作者获得授权. 先说缺点吧: 常驻 ...

  5. PHP计算程序运行时间的类

    <?php class runTime{ private $starTime; private $stopTime; private function getMicTime(){ $mictim ...

  6. linux下搭建属于自己的博客(WordPress安装)

    转自:http://www.cnblogs.com/xiaofengkang/archive/2011/11/16/2251608.html WordPress简介 WordPress 是一种使用 P ...

  7. C语言面试

    最全的C语言试题总结 第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被 ...

  8. Eclipse 快捷键 自动生成get/set注释(转)

    Alt+Shit+S Generaet Getter and Setter  选中Generate method comments 文本编辑 复制行 Ctrl+Alt+向下键 编辑文本 快捷键:选中接 ...

  9. Ring3无敌进程让你的进程变得和smss.exe一样支持64

    本帖最后由 奋斗丶小Z 于 2016-6-6 13:39 编辑 此函数可以启用或关闭开启之后变得和系统进程一样被杀系统直接蓝屏系统进程也是此函数实现的上图 可以用于进程保护 <ignore_js ...

  10. N种内核注入DLL的思路及实现

    内核注入,技术古老但很实用.现在部分RK趋向无进程,玩的是SYS+DLL,有的无文件,全部存在于内存中.可能有部分人会说:"都进内核了.什么不能干?".是啊,要是内核中可以做包括R ...