信息学奥赛一本通 1224:最大子矩阵

2023-10-31

【题目链接】

ybt 1224:最大子矩阵
ybt 1282:最大子矩阵
OpenJudge 2.6 1768:最大子矩阵
洛谷 P1719 最大加权矩形

【题目考点】

1. 动态规划:线性动规

  • 最大子段和

2. 前缀和

【解题思路】

求二维最大子矩阵和,与其相对的一维问题为求最大子段和。
我们可以思考将该二维问题降维为一维问题,而后就是一个求最大子段和的问题了。

记第 ( i , j ) (i,j) (i,j)位置元素的值为 a i , j a_{i,j} ai,j
遍历每一种可能的 i 1 i_1 i1 i 2 i_2 i2的组合,共有 n ( n + 1 ) / 2 n(n+1)/2 n(n+1)/2种情况

i 1 = 1 i_1=1 i1=1 i 2 i_2 i2可以取 1 ∼ n 1\sim n 1n,共 n n n种情况
i 1 = 2 i_1=2 i1=2 i 2 i_2 i2可以取 2 ∼ n 2\sim n 2n,共 n − 1 n-1 n1种情况

i 1 = n i_1=n i1=n i 2 i_2 i2可以取 1 n 1n 1n,共 1 1 1种情况
一共有 1 + 2 + . . . + n = n ( n + 1 ) / 2 1+2+...+n = n(n+1)/2 1+2+...+n=n(n+1)/2种情况

假设考察的子矩阵左上角位置为 ( i 1 , j 1 ) (i_1,j_1) (i1,j1),右下角位置为 ( i 2 , j 2 ) (i_2,j_2) (i2,j2)
i 1 i_1 i1 i 2 i_2 i2确定后,只能改变 j 1 j_1 j1 j 2 j_2 j2,求最大子矩阵和。
如果将每列加和后,作为一个一维数组 b b b的元素,那么该问题就变成了求一维数组 b b b的最大子段和。
将子矩阵压缩成一维数组 b b b b j b_j bj为该子矩阵第 j j j列元素的加和,即: b j = ∑ i = i 1 i 2 a i , j b_j=\sum_{i=i_1}^{i_2}a_{i,j} bj=i=i1i2ai,j
纵向看, b j b_j bj也是一个一维子段和,可以用前缀和方便求出。
s i , j s_{i,j} si,j为第j列第 1 ∼ i 1\sim i 1i行元素的加和,那么 b j = s i 2 , j − s i 1 − 1 , j b_j=s_{i_2,j}-s_{i_1-1,j} bj=si2,jsi11,j
接下来求一维数组 b b b的最大子段和。
求最大子段和的方法可以参考:洛谷 P1115 最大子段和
有使用双指针、线性动规、前缀和的方法。

复杂度分析:

求前缀和不需要额外复杂度,可以一边输入一边求。
选择 i 1 i_1 i1 i 2 i_2 i2一共有 n ( n + 1 ) / 2 n(n+1)/2 n(n+1)/2种情况,复杂度 O ( n 2 ) O(n^2) O(n2),每种情况下求数组b复杂度为 O ( n ) O(n) O(n),求最大子段和复杂度为 O ( n ) O(n) O(n),总体复杂度为 O ( n 3 ) O(n^3) O(n3)
本题n为100, O ( n 3 ) O(n^3) O(n3)是可以接受的。

【题解代码】

解法1:二维变一维,双指针求最大子段和

#include<bits/stdc++.h>
using namespace std;
#define N 105
#define INF 0x3f3f3f3f
int n, a[N][N], b[N], s[N][N];//b[j]:子矩阵第j列的加和 s[i][j]:第j列的第1行到第i行的元素加和 
int mx = -INF;
int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
        { 
            cin >> a[i][j];
            s[i][j] = s[i-1][j] + a[i][j];
        }
    for(int i1 = 1; i1 <= n; ++i1)//子矩阵第一行为原矩阵的第i1行,最后一行为原矩阵的第i2行 
        for(int i2 = i1; i2 <= n; ++i2)
        {
            for(int j = 1; j <= n; ++j)
                b[j] = s[i2][j] - s[i1-1][j];
            int sum = 0;
            for(int j = 1; j <= n; ++j)//双指针法求最大子段和
            {
                if(sum < 0)
                    sum = b[j];
                else
                    sum += b[j];
                mx = max(mx, sum);
            }
        }
    cout << mx;
    return 0;
}

解法2:二维变一维,线性动规求最大子段和

#include<bits/stdc++.h>
using namespace std;
#define N 105
#define INF 0x3f3f3f3f
int n, a[N][N], b[N], s[N][N];//b[j]:子矩阵第j列的加和 s[i][j]:第j列的第1行到第i行的元素加和 
int mx = -INF;
int main()
{
    cin >> n;
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j <= n; ++j)
        { 
            cin >> a[i][j];
            s[i][j] = s[i-1][j] + a[i][j];
        }
    for(int i1 = 1; i1 <= n; ++i1)//子矩阵第一行为原矩阵的第i1行,最后一行为原矩阵的第i2行 
        for(int i2 = i1; i2 <= n; ++i2)
        {
            for(int j = 1; j <= n; ++j)
                b[j] = s[i2][j] - s[i1-1][j];
            int dp[N] = {};//线性动规求最大子段和 
            for(int j = 1; j <= n; ++j)
            {
                dp[j] = max(b[j], dp[j-1]+b[j]);
                mx = max(mx, dp[j]);
            }
        }
    cout << mx;
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

信息学奥赛一本通 1224:最大子矩阵 的相关文章

随机推荐

  • TCP是如何保证包的顺序传输?

    转自 http blog csdn net ggxxkkll article details 7894112 我和大家一起讨论下TCP在保证可靠传输数据的前提下 是怎样对传输的数据进行顺序化操作的 大家都知道 TCP提供了最可靠的数据传输
  • vuecli打包的项目在本地的nginx上访问不了?

    操作过程 1 所有的配置都没有动过 vuecli的所以打包配置 2 npm run build打包 3 把打包的dist 所有文件 放到解压后的ngnix的html里 4 通过127 0 0 1 80 dist index html访问 情
  • 计算机怎么远程桌面,电脑怎么打开远程桌面连接功能

    远程桌面连接是电脑ip地址使用到最强大的功能 电脑怎么开启远程桌面连接呢 下面由学习啦小编为你整理了电脑怎么打开远程桌面连接功能的解决方法 希望对你有帮助 电脑打开远程桌面连接的方法如下 设置静态IP地址 1右键点击电脑桌面的 网络 进入
  • Idea卡在Resolving Maven dependencies的解决方案

    Idea卡在Resolving Maven dependencies的解决方案 在Reimpot All Maven Porjects时 如果项目过大 maven依赖过多 会直接卡在Resolving Maven dependencies这
  • Visual Studio 2022 升级不再附带 .NET Framework 4.5 这种古老的目标包了,本文帮你装回来...

    就在北京时间 2021 年 11 月 9 日凌晨 Visual Studio 2022 正式发布了 着急升级的小伙伴兴致勃勃地升级并卸载了原来的 Visual Studio 2019 后 发现自己的几个库项目竟然无法编译通过了 究其原因 是
  • Myeclipse中workspace打不开的处理办法

    当在Myeclipse中出现这种情况时 可进行如下操作 找到workspace中的下列文件 删除后 重启Myeclipse就可以了 转载于 https my oschina net mikezhaoweb blog 298347
  • Python之使用Python发送HTTP请求

    coding utf 8 import urllib urllib2 url http www love sysu com cloud data name 陈钰 id 12353032 para urllib urlencode data
  • 列表的合并与排序

    读入两行 两行的格式一样 都是用空格分隔的若干个整数 将这些数合并到一个列表中 降序排列后输出整个列表 提示 list1 list map int input split 读入一行由空格分隔的整数 将其存入list1列表中 输入 输入为两行
  • Flutter 设置Container高度自适应GridView和ListView

    参考 1 去掉Container的高度 2 添加下面语句 physics NeverScrollableScrollPhysics shrinkWrap true 完整代码如下 Widget imageSection1 imgPath im
  • ns3链路拥塞实验

    实验目的 收集和分析不同背景流下的路径丢包率与时延性能 拓扑结构 仿真网络拓扑 n0 n5 10 Mb s 2ms n1 n3 10Mb s 10ms n4 n6 n2 n7
  • 【华为OD统一考试A卷

    华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一修改为OD统一考试 A卷 和OD统一考试 B卷 你收到的链接上面会标注A卷还是B卷 请注意 根据反馈 目前大部分收到的都是
  • css 预处理器

    由于多个项目中用到了sass和less 所以就学习了一下相关知识 记录下来方便随时查看 前言 css是用来编写网站样式 但是 其写法比较一成不变 如果想要使用 css 实现 js 一样的变量 常量等 就会比较臃肿 难以维护 所以 作为css
  • 使jira支持reopen率的统计

    jira本身并不能统计bug的reopen率 虽然bug工作流程中有reopen节点 只能借助第三方插件来处理 插件名称 Enhancer Plugin for JIRA 此插件支持自定义字段 自定义计数器等等高级操作 在插件管理中搜索插件
  • docker基础3——制作镜像(基于容器)

    文章目录 一 基本了解 1 1 镜像结构 1 2 docker存储驱动 1 2 1 AUFS 1 2 2 OverlayFS 1 2 3 DeviceMapper 1 3 镜像仓库 二 镜像制作 2 1 基于容器制作镜像 三 镜像导入与导出
  • 双指针的实践

    一 原理 双指针 指的是在遍历对象的过程中 不是普通的使用单个指针进行访问 而是使用两个相同方向 快慢指针 或者相反方向 对撞指针 的指针进行扫描 从而达到相应的目的 换言之 双指针法充分使用了数组有序这一特征 从而在某些情况下能够简化一些
  • 第四章 频域滤波(傅里叶变换频域显示特性)

    一 傅里叶变换频域显示特性 在光学傅里叶变换中 人们已经习惯变换域中 的低谱部分位于中央 频域频谱分布中间低 周围高的特性 有利于频谱的解析和进行各种计算与分析 1 图像中心化 借助傅里叶变换的周期性和频率位移性质 可以对频域进行换位以使频
  • Navicat 11连接MYSQL 8.0问题

    一 问题 MySQL8 0 来使用的时候 通过sqlyog 或者程序中连接数据库时 提示 Authentication plugin caching sha2 password cannot be loaded 的错误 8 0改变了身份验证
  • 第三大的数、字符串中的单词数、排列硬币

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 百日刷题计划 第 16 100 天 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 大连棒棰岛
  • hbase集群在启动的时候报错:JAVA_HOME is not set and Java could not be found

    hbase集群在启动的时候报错 JAVA HOME is not set and Java could not be found 出现这种错误 一般应该是hbase下conf文件下的hbase env sh文件中的java home的环境变
  • 信息学奥赛一本通 1224:最大子矩阵

    题目链接 ybt 1224 最大子矩阵 ybt 1282 最大子矩阵 OpenJudge 2 6 1768 最大子矩阵 洛谷 P1719 最大加权矩形 题目考点 1 动态规划 线性动规 最大子段和 2 前缀和 解题思路 求二维最大子矩阵和