题目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. 最大子矩阵和的更多相关文章

  1. hdu 1081 dp问题:最大子矩阵和

    题目链接 题意:给你一个n*n矩阵,求这个矩阵的最大子矩阵和 #include<iostream> #include<cstdio> #include<string.h& ...

  2. 基础dp例题整理

    背包: 消失之物 先直接做一遍,必然对于i,有 for(j=m;j>=w[i];--j) f[i]+=f[i-w[i]] 所以,如果排除用i做背包的结果,减去这个转移就好了. memcpy(g, ...

  3. [hdu 4734]数位dp例题

    通过这个题目更加深入了解到了数位dp在记忆化搜索的过程中就是实现了没有限制条件的n位数的状态复用. #include<bits/stdc++.h> using namespace std; ...

  4. 大白第一章第四节dp例题

    入口 UVALive - 3882 #include<cstdio> using namespace std; ; int n,m,k,f[N]; int main(){ //f[i]表示 ...

  5. dp例题02. 滑雪问题 (poj1088)

    poj1088滑雪问题 题目链接:http://poj.org/status Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得 ...

  6. dp例题01. 任务价值最大化

    题目Description: 大凯有n项任务可选择去做, 分别对应有开始时间, 结束时间以及任务报酬, 同一时间内最多做一件任务, 现在大凯想知道最多能得到多少报酬, 于是把求解任务交给了你. 输入: ...

  7. 区间dp 例题

    D - 石子合并问题--直线版 HRBUST - 1818 这个题目是一个区间dp的入门,写完这个题目对于区间dp有那么一点点的感觉,不过还是不太会. 注意这个区间dp的定义 dp[i][j] 表示的 ...

  8. NOI题库 1768最大子矩阵 题解

    NOI题库 1768最大子矩阵  题解     总时间限制: 1000ms 内存限制: 65536kB   描述   已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...

  9. LightOJ1033 Generating Palindromes(区间DP/LCS)

    题目要计算一个字符串最少添加几个字符使其成为回文串. 一年多前,我LCS这道经典DP例题看得还一知半解时遇到一样的问题,http://acm.fafu.edu.cn/problem.php?id=10 ...

随机推荐

  1. Linux学习5-安装mysql

    前言 今天我们来学习一下如何在Linux下安装mysql 一:准备安装包 可以从http://www.mysql.com/downloads/官方网站下载到最新版本,本次安装的版本是mysql-5.7 ...

  2. web前端问题整理

    1.常用那几种浏览器测试?有哪些内核(Layout Engine)? (Q1)浏览器:IE,Chrome,FireFox,Safari,Opera (Q2)内核:Trident,Gecko,Prest ...

  3. 使用NPOI将Excel表导入到数据库中

    public string ExcelFile() { //指定文件路径, string fileName=@"d:\Stu.xls"; //创建一个文件流,并指定其中属性 usi ...

  4. NLP自然语言处理入门-- 文本预处理Pre-processing

    引言 自然语言处理NLP(nature language processing),顾名思义,就是使用计算机对语言文字进行处理的相关技术以及应用.在对文本做数据分析时,我们一大半的时间都会花在文本预处理 ...

  5. PHP8年开发经验原创开发文档教程

    订阅微信公众号: gzgwgas 每天为你分享PHP开发经验,坚决不踩坑,坚决不入坑. 微信扫码,关注公众号有惊喜!

  6. ajax js分页算法分析

    显示效果:[页面总数小于等于10,全部显示,当前页特殊显示]上一页  1   2   3   4   5   6   7   8   9   10   下一页 [页面总数大于10,部分显示,当前页特殊 ...

  7. SpringCloud系列之配置中心(Config)使用说明

    大家好,最近公司新项目采用SpingCloud全家桶进行开发,原先对SpringCloud仅仅只是停留在了解的初级层面,此次借助新项目的契机可以深入实践下SpringCloud,甚是Happy.大学毕 ...

  8. Python - 面向对象(一)入门篇

    Python里面有一句话:万物皆是对象 如何面向对象编程 设计类 创建类实例对象 实例对象调用方法 创建对象 在内存中为对象分配空间 调用初始化方法  __init__  为对象初始化 对象创建后,内 ...

  9. Git&Github入门

    Github: 仓库repository: 存放项目代码,每个项目对应一个项目 收藏star: 收藏 复制克隆项目(Fork): 发起请求Pull Reques: 别人改进你的代码,如果觉得不错可以合 ...

  10. canvas绘制折线图

    效果图: 重难点: 1.画布左上角的顶点的坐标为(0 ,0),右下角的坐标最大,与平常思维相反 2.数据的处理 html代码: <!DOCTYPE html><html lang=& ...