首页 > 编程语言 >每日OJ题_牛客_DP10最大子矩阵_二维前缀和_C++_Java

每日OJ题_牛客_DP10最大子矩阵_二维前缀和_C++_Java

时间:2024-10-24 22:46:20浏览次数:3  
标签:Java OJ int 矩阵 C++ 牛客 vector public 前缀

目录

牛客_DP10最大子矩阵_二维前缀和

题目解析

C++代码

Java代码


牛客_DP10最大子矩阵_二维前缀和

最大子矩阵_牛客题霸_牛客网 (nowcoder.com)

描述:

        已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是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个整数……)给出矩阵中的N^2个整数,整数之间由空白字符分隔(空格或者空行)。 已知矩阵中整数的范围都在[-127, 127]。

输出描述:

输出最大子矩阵的大小。

输入:

4
0 -2 -7 0
9 2 -6 2
-4 1 -4  1
-1 8  0 -2

输出:

15


题目解析

二维前缀和矩阵的应用。

  1. 初始化二维前缀和矩阵。
  2. 枚举所有的子矩阵,求出最大子矩阵。

C++代码

#include <climits>
#include <iostream>
#include <vector>
using namespace std;

#define int long long

signed main()
{
    int n = 0;
    cin >> n;
    vector<vector<int>> vv(n, vector<int>(n));
    int res = INT_MIN;
    for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < n; ++j)
        {
            cin >> vv[i][j];
            res = max(res, vv[i][j]);
        }
    }
    vector<vector<int>> preSum(n + 1, vector<int>(n + 1));
    for(int i = 1; i <= n; ++i)
    {
        for(int j = 1; j <= n; ++j)
        {
            preSum[i][j] = preSum[i - 1][j] + preSum[i][j - 1] - preSum[i - 1][j - 1] + vv[i - 1][j - 1];
        }
    }
    // for(int i = 1; i <= n; ++i)
    // {
    //     for(int j = 1; j <= n; ++j)
    //     {
    //         cout << preSum[i][j] << " ";
    //     }
    //     cout << endl;
    // }
    for(int i = 1; i <= n; ++i) // 下次用x1,y1, x2,y2
    {
        for(int j = 1; j <= n; ++j)
        {
            for(int ii = 1; ii <= i; ++ii)
            {
                for(int jj = 1; jj <= j; ++jj)
                {
                    res = max(res, preSum[i][j] - preSum[i][jj - 1] - preSum[ii - 1][j] + preSum[ii - 1][jj - 1]); // 注意-1
                    // cout << i << j << " " << ii << jj << endl;
                }
            }
        }
    }
    cout << res << endl;
    return 0;
}

/*
0 -2 -7 0 
9  9 -4 -2 
-4 6 -2 -3 
-1 13 11 6 
9

0 -2 -9 -9 
9 9  -4 -2 
5 6 -11 -8 
4 13 -4 -3 
15

*/

Java代码

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
    public static int n;
    public static int[][] dp = new int[110][110];
    public static void main(String[] args) 
    {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                int x = in.nextInt();
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1] + x;
            }
        }
        int ret = -127;
        for(int x1 = 1; x1 <= n; x1++)
        {
            for(int y1 = 1; y1 <= n; y1++)
            {
                for(int x2 = x1; x2 <= n; x2++)
                {
                    for(int y2 = y1; y2 <= n; y2++)
                    {
                        ret = Math.max(ret, dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1]);
                    }
                }
            }
        }
        System.out.println(ret);
    }
}

标签:Java,OJ,int,矩阵,C++,牛客,vector,public,前缀
From: https://blog.csdn.net/GRrtx/article/details/143167663

相关文章

  • Java锁机制
    synctronized是互斥锁吗?ChatGPTChatGPT是的,synchronized是一种互斥锁机制。在Java中,synchronized关键字用于实现同步机制,确保在多线程环境下对共享资源的访问是安全的。当一个线程进入**synchronized代码块或方法时,它会尝试获取锁。如果锁已经被其他线程持有,那么当前线程将......
  • 【子项目:命令系统(Command System)】C++自制命令系统( 开发ing | 踩坑记录 )
    项目背景在某一项目中,遇到了需要自制命令系统的需求,而这个模块的复用性很高,因此单独拉出来做一个子项目更新日志[2024.10.15-10:00]增项目进度----[2024.10.1510:00]----首先实现最基础的输入输出功能,用std::getline读入行再分割成字符串数组-main.cpp#include......
  • 面试华为遇到了经典动态规划题 - 怎么用go、C++进行编程解决
    华为的知名很大程度上源自于在经历过被美国的制裁和打压后不仅撑住了,而且还做出了相对于自己来说技术进步程度很大的芯片​。这是一个不小的成绩​。从个人的角度上来说,华为是最难进的一家大公司之一,它的面试标准很严格​。这不仅是筛选人才,在某种程度上来说也是由于求职市场......
  • 【C++干货篇】——C/C++内存管理
    【C++干货篇】——C/C++内存管理文章目录【C++干货篇】——C/C++内存管理1.C/C++内存分布1.1静态区/数据段:1.2常量区/代码段:1.3栈:1.4堆:1.5.内存映射区:2.C语言中动态内存管理方式:`malloc/calloc/realloc/free`1.`malloc`2.`calloc`3.`realloc`总结3.C++内存管理方......
  • Visual Studio 2022工作原理及相关配置参数(干货满满)——C++
    最近工作有点忙,毕业也没多久,确实在企业和学校还是有很大的差距的,这段时间学到了很多很多,也没时间顾及博客了,刚好趁着这个1024稍微放慢脚步,总结总结。最近用VisualStudio比较频繁,也学到了很多相关的内容,借此博文简单记录一下,全是个人理解,若有地方理解有误还请各位大佬评论......
  • Java 中回调机制是什么原理
    Java中回调机制的原理:1.回调机制概述;2.接口作为回调的关键;3.事件监听器模式;4.注册和解注册回调对象;5.回调与多线程;6.内置回调机制的例子。回调机制是一种常见的编程范式,特别是在事件驱动编程中。在Java中,回调机制允许一个对象(回调对象)注册在另一个对象(调用对象)上,并在特定......
  • jspm基于Java web的在线餐饮管理系统的设计和实现(11862)
     有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发......
  • Java类和对象详解(上)
    目录前言 一.类和对象的定义1.什么是一个类?2.类的定义格式 3.一个类中应该有什么 4.什么是对象二.类的实例化1.什么是实例化?2.实例化在内存中的使用情况: 三.构造方法(构造器)1.什么是构造方法2. 默认初始化3.this关键字3.1为什么要有this关键字3.2什么是thi......
  • 0基础学java之Day14
    Object含义:基类也叫做超类,Object是所有类的祖先类注意:如果一个类没有明确继承的父类,默认继承Objectequals:比较两个对象内存地址是否相同hashCode():获取对象的hash值注意:1.hash码是内存地址+散列算法得到的一个数字2.hash码不等于内存地址3.hash码可能相同getClass:......
  • Java类和对象详解(下)
    目录前言:一.static关键字 1.static修饰成员变量2..static修饰成员方法3.静态代码块 二.代码块 1.普通代码块2.静态代码块3.静态代码块三.继承1.什么是继承2.为什么要继承3.继承的使用 4.父类的访问(super关键字)5. 子类构造方法6.代码执行顺序 7.组......