二维前缀和的扩展

最大子矩阵

https://www.nowcoder.com/practice/a5a0b05f0505406ca837a3a76a5419b3

如果说,这题用一个预处理一个二维前缀和,然后枚举子矩阵的左上角与右上角,那么我们可以用O(n4)O(n^4)的时间复杂度得到答案。不过对于这题n=100来说,1004=108100^4=10^8会超时。

所以我们要想办法优化,最蛋疼的点其实在于暴力的枚举会涉及非常多无用的状态。我们可以优化枚举,转而变成枚举上界与下界。

alt

类似这样,两条红线是我们枚举的上下界。那么问题来了,如何快速的得到两条红线夹出来的子矩阵里的最大子矩阵?(我称之为子子矩阵)

我们可以考虑这个问题的简化版。如果快速得到一个序列里的最大子序列和?这是一个经典的线性dp问题,可以用O(n)O(n)时间复杂度解决。我们这简化问题迁移到原问题上面来,这样一个子矩阵里的最大子子矩阵,要套用简化问题里的dp方程,我们必须得首先把整个列压缩成一个元素。(把一列看成一个元素,那么整个矩形就被压缩成了一个序列)而这启发我们在列上做一个前缀和。

只要在列上做了一个前缀和,那么我们就可以直接套用最大子序和的dp方程来O(n)O(n)得到最大子子矩阵。而枚举子矩阵是用两条红线来枚举的,时间复杂度是O(n2)O(n^2)。因此总的时间复杂度就是O(n3)O(n^3)

#include <iostream>

using namespace std;

const int N = 110;

int n;
int grid[N][N];
int s[N][N];

int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            scanf("%d", &grid[i][j]);
    
    //做一个列方向上的前缀和
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= n; ++j)
            s[i][j] = s[i - 1][j] + grid[i][j];
    
    int res = -1e9;
    for (int i = 1; i <= n; ++i)
        for (int j = i; j <= n; ++j)
        {
            int f = 0; //进行最大子序列和的dp
            for (int k = 1; k <= n; ++k)
            {
                int w = s[j][k] - s[i - 1][k];
                f = max(0, f) + w;
                res = max(res, f);
            }
        }
    printf("%d\n", res);
    return 0;
}
全部评论

相关推荐

老粉都知道小猪猪我很久没更新了,因为秋招非常非常不顺利,emo了三个月了,接下来说一下我的情况吧本人是双非本&nbsp;专业是完全不着计算机边的非科班,比较有优势的是有两段大厂实习,美团和字节。秋招面了50+场泡池子泡死的:滴滴&nbsp;快手&nbsp;去哪儿&nbsp;小鹏汽车&nbsp;不知名的一两个小厂其中字节13场&nbsp;两次3面挂&nbsp;两次2面挂&nbsp;一次一面挂其中有2场面试题没写出来,其他的都是全a,但该挂还是挂,第三次三面才面进去字节,秋招加暑期总共面了22次字节,在字节的面评可以出成书了快手面了8场,2次实习的,通过了但没去,一次2面挂&nbsp;最后一次到录用评估&nbsp;至今无消息滴滴三面完&nbsp;没几天挂了&nbsp;所有技术面找不出2个问题是我回答不上来的,三面还来说我去过字节,应该不会考虑滴滴吧,直接给我干傻了去哪儿一天速通&nbsp;至今无消息小鹏汽车hr&nbsp;至今无消息美团2面挂&nbsp;然后不捞我了,三个志愿全部结束,估计被卡学历了虾皮二面挂&nbsp;这个是我菜,面试官太牛逼了拼多多二面挂&nbsp;3道题也全写了&nbsp;也没问题是回答不出来的&nbsp;泡一周后挂腾讯面了5次&nbsp;一次2面挂&nbsp;三次一面挂,我宣布腾讯是世界上最难进的互联网公司然后还有一些零零散散的中小厂,但是数量比较少,约面大多数都是大厂。整体的战况非常惨烈,面试机会少,就算面过了也需要和各路神仙横向对比,很多次我都是那个被比下去的人,不过这也正常,毕竟谁会放着一个985的硕士不招,反而去招一个双非读化学的小子感觉现在互联网对学历的要求越来越高了,不仅仅要985还要硕士了,双非几乎没啥生存空间了,我感觉未来几年双非想要进大厂开发的难度应该直线上升了,唯一的打法还是从大二刷实习,然后苟个转正,不然要是去秋招大概率是炮灰。而且就我面字节这么多次,已经开始问很多ai的东西了,你一破本科生要是没实习没科研懂什么ai啊,纯纯白给了
不知名牛友_:爸爸
秋招你被哪家公司挂了?
点赞 评论 收藏
分享
2025-12-10 19:36
湖北工业大学 Web前端
饿魔:看到在线简历了吧
点赞 评论 收藏
分享
评论
13
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务