题目来源:To the Max

题目大意:给定一个N*N的矩阵,求该矩阵中的某一个矩形,该矩形内各元素之和最大,即最大子矩阵问题。

解题方法:最大子序列之和的扩展

解题步骤:

1、定义一个N*N的矩阵state,state[j][k]用来存放矩阵的某行中第j到k个元素的最大值;

2、对于行如何处理呢?我们可以将第一行中的N个元素的所有组合的最大值存放在state中,如果有哪个值小于0,清零,因为它没有做任何贡献;定计算第二行时与第一行的值(全部大于等于0)进行累加,这样就完成了第一行与第二行的累加,即计算一个2行的子矩阵,依次类推。

具体算法(java版,可以直接AC)

 static int maxValue(int[][] array, int size) {
int max = Integer.MIN_VALUE;
int[][] state = new int[size][size];
for (int i = 0; i < size; i++) { // 第i行
for (int j = 0; j < size; j++) {// 第j列
int sum = 0;
for(int k=j;k<size;k++){// 第k列
sum+=array[i][k]; //计算从i到k的值
state[j][k] += sum;
if (state[j][k] > max) {
max = state[j][k];
}
if(state[j][k]<0){ //没有做贡献,清零
state[j][k]=0;
}
}
}
}
return max;
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int size = input.nextInt();
int[][] array = new int[size][size];
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
array[i][j] = input.nextInt();
}
}
System.out.println(maxValue(array, size));
}

为了方便理解,贴出state中值得变化情况:

数据:

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

i=0时state中的值(由于第一行所有的值都不大于0,所以全部为0):

0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

i=1时state中的值:

9 11 5 7
0 2 0 0
0 0 0 0
0 0 0 2

i=2时state中的值:

5 8 0 1
0 3 0 0
0 0 0 0
0 0 0 3

i=3时state中的值:

4 15 7 6
0 11 8 6
0 0 0 0
0 0 0 1

如果有什么更好地解决方案,希望大家可以一起分享!

POJ 1050 To the Max 最详细的解题报告的更多相关文章

  1. POJ 1046 Color Me Less 最详细的解题报告

    题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...

  2. POJ 1063 Flip and Shift 最详细的解题报告

    题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...

  3. POJ 1050 To the Max 最大子矩阵和(二维的最大字段和)

    传送门: http://poj.org/problem?id=1050 To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submi ...

  4. poj 1050 To the Max(最大子矩阵之和)

    http://poj.org/problem?id=1050 我们已经知道求最大子段和的dp算法 参考here  也可参考编程之美有关最大子矩阵和部分. 然后将这个扩大到二维就是这道题.顺便说一下,有 ...

  5. POJ 1050 To the Max 暴力,基础知识 难度:0

    http://poj.org/problem?id=1050 设sum[i][j]为从(1,1)到(i,j)的矩形中所有数字之和 首先处理出sum[i][j],此时左上角为(x1,y1),右下角为(x ...

  6. POJ 1050 To the Max -- 动态规划

    题目地址:http://poj.org/problem?id=1050 Description Given a two-dimensional array of positive and negati ...

  7. poj 1050 To the Max (简单dp)

    题目链接:http://poj.org/problem?id=1050 #include<cstdio> #include<cstring> #include<iostr ...

  8. poj - 1050 - To the Max(dp)

    题意:一个N * N的矩阵,求子矩阵的最大和(N <= 100, -127 <= 矩阵元素 <= 127). 题目链接:http://poj.org/problem?id=1050 ...

  9. poj 1050 To the Max(线性dp)

    题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...

随机推荐

  1. Mac搭建Fluter应用环境

    1.创建一个路径.例如我创建是: /Users/chenghui/ 然后创建一个文件夹: development 把下载好的Fluter 解压到当前目录下: development /Users/ch ...

  2. 多应用下 Swagger 的使用,这可能是最好的方式!

    问题 微服务化的时代,我们整个项目工程下面都会有很多的子系统,对于每个应用都有暴露 Api 接口文档需要,这个时候我们就会想到 Swagger 这个优秀 jar 包.但是我们会遇到这样的问题,假如说我 ...

  3. TensorFlow从0到1之TensorFlow多层感知机实现MINIST分类(22)

    TensorFlow 支持自动求导,可以使用 TensorFlow 优化器来计算和使用梯度.它使用梯度自动更新用变量定义的张量.本节将使用 TensorFlow 优化器来训练网络. 前面章节中,我们定 ...

  4. mysql关于group by的用法

    原文:https://blog.csdn.net/u014717572/article/details/80687042 先来看下表1,表名为test: 表1 执行如下SQL语句: SELECT na ...

  5. opencv3.1.0 计算机中丢失 opencv_world310d.dll _vs2017解决方法

    ---------------------------opencv1.exe - 系统错误---------------------------无法启动此程序,因为计算机中丢失 opencv_worl ...

  6. upd套接字服务器与客户端交互C++代码示范

    upd套接字服务器与客户端交互C++代码示范 // vc2_2_4UDPserver_Txwtech.cpp : 定义控制台应用程序的入口点. //服务器端 #include "StdAfx ...

  7. Flutter学习笔记(35)--通知Notification

    如需转载,请注明出处:Flutter学习笔记(35)--通知Notification 通知的NotificationListener和我们之前写的事件的Listener一样,都是功能性的组件,而且也都 ...

  8. 微信小程序之后端处理

    首先,来看一下后端的关系图: 这边主要介绍PHP的一些基础语法等等,关于将php代码部署到SAE新浪云,大家可以参考这个链接:https://www.cnblogs.com/dhx96/p/65617 ...

  9. JavaWeb的登陆与注销功能

    JavaWeb 登录与注销 大致流程 一般我们在Web应用中 登录页面一般是以 login.jsp的首页 大致流程如下: 当我们在前台写入用户名和密码之后,点击登录按钮 会将表单提交给一个LoginS ...

  10. Python-16-分配参数

    与收集参数相反,这里用*和**分配参数   def add(x, y):          return x + y   使用*分配元组 params = (1, 2) >>> ad ...