Java实现 蓝桥杯 历届试题 最大子阵

摘要:
publicstaticlong[][]映射;m=in.nextInt();map=新长[n][m];对于(inti=0;i<j++)map[i][j]=in.nextLong();for(intstart=0;long[]dp=newlong[m];for(intest=start;n;

问题描述
  给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。

其中,A的子矩阵指在A中行和列均连续的一块。
输入格式
  输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
  接下来n行,每行m个整数,表示矩阵A。
输出格式
  输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
3 3
-1 -4 3
3 4 -1
-5 -2 8
样例输出
10
样例说明
  取最后一列,和为10。
数据规模和约定
  对于50%的数据,1<=n, m<=50;
  对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。

import java.util.Scanner;

public class Main {
    public static int n, m;
    public static long[][] map;
    public static long result = Long.MIN_VALUE;
    
    
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        map = new long[n][m];
        for(int i = 0;i < n;i++)
            for(int j = 0;j < m;j++)
                map[i][j] = in.nextLong();
        for(int start = 0;start < n;start++) {  //开始行
            long[] ring = new long[m];
            long[] dp = new long[m];
            for(int end = start;end < n;end++) {  //结束行
                for(int j = 0;j < m;j++)      //计算start~end行的每一列元素和
                    ring[j] += map[end][j];
                result = Math.max(result, ring[0]);
                dp[0] = ring[0];
                for(int j = 1;j < m;j++) {
                    if(dp[j - 1] < 0)
                        dp[j] = ring[j];
                    else
                        dp[j] = dp[j - 1] + ring[j];
                    result = Math.max(result, dp[j]);
                }
            }
        }
        System.out.println(result);
    }
}

免责声明:文章转载自《Java实现 蓝桥杯 历届试题 最大子阵》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MongoDB 备份与恢复的实践使用Libreoffice处理office文档,OFFICE转PDF,OFFICE转图片,OFFICE转图片包含加水印逻辑下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

非原创-Prometheus 查询语言

Prometheus 查询语言 PromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多。使用它可以对时序数据进行筛选和聚合。 1. PromQL 语法 1.1 数据类型 PromQL 表达式计算出来的值有以下几种类型: 瞬时向量 (Instant vector...

Groovy 学习手册(5)

8. 函数式编程 函数式编程(FP)是一种编程风格,侧重于函数和最小化状态的变化(使用不可变的数据结构)。它更接近于用数学来表达解决方案,而不是循序渐进的操作。 在函数式编程里,其功能应该是“无副作用”(不会改变外部功能),参考透明的(一个函数每次传递相同的参数,返回相同的值)。 函数式编程可以被看作是一种更常见的命令式编程的替代,它更接近告诉计算机遵循每...

Algorithm算法库

algorithm 是C++标准程式库中的一个头文件,定义了C++ STL标准中的基础性的算法(均为函数模板)。在C++98中,共计有70个算法模板函数;在C++11中,增加了20个算法模板函数。其中有5个算法模板函数定义在头文件numeric中。 下文所称的“序列”(sequence),是指可以用迭代器顺序访问的容器。 有返回值的函数,返回值都是迭代器,...

Chrome开发者之测试应用

一、Chrome开发者工具简介 1.1、开发者工具(DevTools)调用 二、Chrome DevTools详细介绍 1.1、模块介绍 2.1、元素(Elements)详解 2.1.1、元素编辑 2.1.2、辅助元素定位 2.1.3、ChroPath插件 3.1、控制台(Console)详解 4.1、源代码(Sources)详解 5.1、网络(Netwo...

关于map 容器insert顺序

  今天测试我的节点,maya一次次死掉,一点一点的打印测试,良久才知:我想当然的将插入map的顺序,作为我执行的顺序直接遍历,打印数据显示,map有自动将键值排序的功能,比如以字符串为例,会按照a、b、c....顺序排好。    而且对于map,如果一个元素key不存在,但是直接map[key],那么map的size就增加1,我感觉有点儿相当于inser...

[Data Structure &amp;amp; Algorithm] 八大排序算法

  排序有内部排序和外部排序之分,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。我们这里说的八大排序算法均为内部排序。   下图为排序算法体系结构图:   常见的分类算法还可以根据排序方式分为两大类:比较排序和非比较排序。本文中前七种算法都是比较排序,非比较排序有三种,分别为:  ...