dp例题03. 最大子矩阵和
题目Description:
给出一个矩阵, 求子矩阵(可以是其本身)数之和的最大值
Input:
第一行 为行数n和列数m (n≤500, m≤500)
接下来为一个n行m列的矩阵 (每个值ai,−1000 ≤ ai ≤ 1000)
Output:
子矩阵(可以是其本身)数之和的最大值
Sample Input:
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
Sample Output:
15
解题思路:
解法1:单纯用二维前缀和 时间复杂度O(n*n*m*m);(TLE)
解法2:dp+前缀和 时间复杂度O(n*n*m) 或O(n*m*m)
如果是求一维的最长子序列 我们会用O(n)的时间复杂度求出
而这里为二维的, 能否用一维的解法思想去转化一下?
刚开始从行数遍历(不裁剪列数情况下)所有的子矩阵, 需要O(n²)时间, 之后对于这样遍历的子矩阵进行求解最大和,能否利用O(m)时间完成求解
遍历后的二维子矩阵可以一维数组化(即 将 单列上的数相加为一个数, 构造出plus数组), 再利用求一维最长子序列的思想(O(m)时间复杂度)即可
构造plus数组:利用每一列上的前缀和, 比如求第 k 列上第 i 行到第 j 行的数之和 plus[k] = col_sum[j][k] - col_sum[i-1][k]; O(1) 时间复杂度
单独构造col_sum数组: O(n*m)时间复杂度
以下为c语言代码(解法2)
#include <stdio.h>
int a[][], col_sum[][];
int max_subsequence(int * a, int n) {
int sum = -1e7, max = -1e7;
for (int i = ; i < n; i++) {
sum = (sum + a[i] > a[i])? sum + a[i] : a[i];
max = (sum > max)? sum : max;
}
return max;
}
int main() {
int row, col, plus[];
scanf("%d%d", &row, &col);
for (int i = ; i < row; i++) {
for (int j = ; j < col; j++) {
scanf("%d", &a[i][j]);
}
}
for (int j = ; j < col; j++) {
for (int i = ; i < row; i++) {
if (i == ) {
col_sum[i][j] = a[i][j];
}
else {
col_sum[i][j] = col_sum[i-][j] + a[i][j];
}
}
}
int ans = -1e7;
for (int i = ; i < row; i++) {
for (int k = i; k < row; k++) {
if (i == ) {
for (int j = ; j < col; j++) {
plus[j] = col_sum[k][j];
}
int temp = max_subsequence(plus, col);
ans = (temp > ans) ? temp : ans;
}
else {
for (int j = ; j < col; j++) {
plus[j] = col_sum[k][j] - col_sum[i-][j];
}
int temp = max_subsequence(plus, col);
ans = (temp > ans) ? temp : ans;
}
}
}
printf("%d\n", ans);
return ;
}
dp例题03. 最大子矩阵和的更多相关文章
- hdu 1081 dp问题:最大子矩阵和
题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ...
- 基础dp例题整理
背包: 消失之物 先直接做一遍,必然对于i,有 for(j=m;j>=w[i];--j) f[i]+=f[i-w[i]] 所以,如果排除用i做背包的结果,减去这个转移就好了. memcpy(g, ...
- [hdu 4734]数位dp例题
通过这个题目更加深入了解到了数位dp在记忆化搜索的过程中就是实现了没有限制条件的n位数的状态复用. #include<bits/stdc++.h> using namespace std; ...
- 大白第一章第四节dp例题
入口 UVALive - 3882 #include<cstdio> using namespace std; ; int n,m,k,f[N]; int main(){ //f[i]表示 ...
- dp例题02. 滑雪问题 (poj1088)
poj1088滑雪问题 题目链接:http://poj.org/status Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得 ...
- dp例题01. 任务价值最大化
题目Description: 大凯有n项任务可选择去做, 分别对应有开始时间, 结束时间以及任务报酬, 同一时间内最多做一件任务, 现在大凯想知道最多能得到多少报酬, 于是把求解任务交给了你. 输入: ...
- 区间dp 例题
D - 石子合并问题--直线版 HRBUST - 1818 这个题目是一个区间dp的入门,写完这个题目对于区间dp有那么一点点的感觉,不过还是不太会. 注意这个区间dp的定义 dp[i][j] 表示的 ...
- NOI题库 1768最大子矩阵 题解
NOI题库 1768最大子矩阵 题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...
- LightOJ1033 Generating Palindromes(区间DP/LCS)
题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...
随机推荐
- ABP开发框架前后端开发系列---(16)ABP框架升级最新版本的经验总结
有一小段时间没有持续升级ABP框架了,最近就因应客户的需要,把ABP框架进行全面的更新,由于我们应用的ABP框架,基础部分还是会使用官方的内容,因此升级的时候需要把官方基础ABP的DLL进行全面的更新 ...
- Redis系列三 - 缓存雪崩、击穿、穿透
前言 从学校出来,做开发工作也有一定时间了,最近有想系统地进一步深入学习,但发现基础知识不够扎实,故此来回顾基础知识,进一步巩固.加深印象. 最初开始接触编程时,总是自己跌跌撞撞.不断摸索地去学习,再 ...
- selenium+options配置文件
from selenium.webdriver.chrome.options import Options from selenium import webdriver chrome_options ...
- Simulink仿真入门到精通(十一) 模块的封装
当用户编写了自定义的S函数或者使用Simulink标准库中的模块搭建子系统后,可以通过封装为其设计显示外观,追加参数对话框. 封装是构建一个以对话框为接口的交互界面的过程,它将复杂的模块逻辑关系隐藏起 ...
- Jupyter NoteBook 系列之 安装启动和常用设置
介绍 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,目前支持运行 40 多种编程语言. Jupyter Notebook 的本质是一个 Web 应 ...
- [vue ]滚动视图解决ElementUI NavMenu 导航菜单过长显示的问题
记录一下工作 需求 导航菜单过长的时候会溢出,需要一个像 Tabs 标签页一样的滚动视图容器,可以左右滚动内部视图. 解决方法 由于时间问题,所以直接将 Tabs 源码抽取出来使用. 这里要做一些特殊 ...
- Fiddler3 使用技巧
1.Fiddler抓不到包怎么解决 (1)先确定是HTTP包抓不到还是HTTPS包抓不到.如果只是HTTPS包抓不到,说明是证书的问题,需要重新安装证书. (2)检查浏览器的HTTP代理设置是否正确, ...
- Mol Cell Proteomics. | 粪便微生物蛋白质的组成与饮食诱导肥胖倾向的关联研究
题目:Associations of the Fecal Microbial Proteome Composition and Proneness to Diet-induced Obesity 期刊 ...
- AI学习笔记:人工智能与机器学习概述
一.人工智能基本概念 1.1 基本概念 数据分析:对历史规律的展现.对未来数据的预测. 机器学习:机器学习是指从一系列的原始数据中找到规律,提取人们可以识别的特征,然后通过学习这些特征,最终产生一个模 ...
- zabbix笔记_008 zabbix监控交换机路由器
zabbix监控交换机路由器 要监控路由器交换机,需要使用到SNMP协议 SNMP是一个简单网络管理协议,他基于C/S模型实现的监控和管理. 服务器安装SNMP: yum -y install net ...