POJ 1050 To the Max 最详细的解题报告
题目来源: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 最详细的解题报告的更多相关文章
- POJ 1046 Color Me Less 最详细的解题报告
题目来源:POJ 1046 Color Me Less 题目大意:每一个颜色由R.G.B三部分组成,D=Math.sqrt(Math.pow((left.red - right.red), 2)+ M ...
- POJ 1063 Flip and Shift 最详细的解题报告
题目来源:Flip and Shift 题目大意:一个椭圆形的环形容器中有黑色和白色两种盘子,问你是否可以将黑色的盘子连续的放在一起.你可以有以下两种操作: 1.顺时针旋转所有的盘子 2.顺时针旋转3 ...
- POJ 1050 To the Max 最大子矩阵和(二维的最大字段和)
传送门: http://poj.org/problem?id=1050 To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submi ...
- poj 1050 To the Max(最大子矩阵之和)
http://poj.org/problem?id=1050 我们已经知道求最大子段和的dp算法 参考here 也可参考编程之美有关最大子矩阵和部分. 然后将这个扩大到二维就是这道题.顺便说一下,有 ...
- 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 ...
- POJ 1050 To the Max -- 动态规划
题目地址:http://poj.org/problem?id=1050 Description Given a two-dimensional array of positive and negati ...
- poj 1050 To the Max (简单dp)
题目链接:http://poj.org/problem?id=1050 #include<cstdio> #include<cstring> #include<iostr ...
- poj - 1050 - To the Max(dp)
题意:一个N * N的矩阵,求子矩阵的最大和(N <= 100, -127 <= 矩阵元素 <= 127). 题目链接:http://poj.org/problem?id=1050 ...
- poj 1050 To the Max(线性dp)
题目链接:http://poj.org/problem?id=1050 思路分析: 该题目为经典的最大子矩阵和问题,属于线性dp问题:最大子矩阵为最大连续子段和的推广情况,最大连续子段和为一维问题,而 ...
随机推荐
- 油猴脚本 之 网教通直播评论记录抓取 v2.0
先放一个 <油猴脚本 之 网教通直播评论记录抓取>那篇文章的传送门 . 修复内容 将所有表情转为 [符号表情] 字样,而非删除: 修复被禁言用户读取异常,现在被禁言用户表示为 张三 [已禁 ...
- turtle绘制彩色螺旋线
代码实现: #绘制彩色螺旋线 import turtle import time turtle.pensize(2) turtle.bgcolor("black") colors ...
- Android学习笔记Tab代替ActionBar做的顶部导航
1.先准备5个Fragement作为标签页 package com.lzp.youdaotab; import android.os.Bundle; import android.view.Layou ...
- python基础整理(2)
布尔表达式与其余值的替换 值的测试 Python不仅仅可以使用布尔型变量作为条件,它可以直接在if中使用任何表达式作为条件: 大部分表达式的值都会被当作True,但以下表达式值会被当作False: F ...
- 点击提交按钮,屏幕会出现闪烁问题,element.style问题
点击提交按钮,屏幕会出现闪烁问题 通过后台调试发现,在点击的按钮的时候会给body添加一个padding值,而且会出现怎么都修改不了的问题,会发现里面会有 element.style的值,这其实是一种 ...
- python测试标准库doctest
引言: doctest是python的一个测试用标准库. 顾名思义,这个模块会寻找程序里面看起来像交互式Python会话的文本片段,然后运行这个会话,来判断实际运行结果和你希望的结果是否一致. 这个模 ...
- Cookie的简介与使用
Cookie 历来指就着牛奶一起吃的点心.然而,在因特网内,"Cookie"这个字有了完全不同的意思.那么"Cookie"到底是什么呢?"Cookie ...
- vue入门的第一天:v-clock、v-text、v-html的使用
vue入门的第一天 1. v-cloak v-cloak可以解决插值闪烁问题(防止代码被人看见),在元素里加入 v-cloak即可 html: <p v-cloak>{{msg}}< ...
- elasticSearch数据库、skywalking集群部署
Centos6上面安装elasticsearc数据库的集群 安装的是6.3.2版本,安装之前首先要先安装jdk1.8版本 安装之前首先需要关闭防火墙 Centos6 sudo service ipta ...
- Linux下9种优秀的代码比对工具推荐
大家好,我是良许. 在我们编写代码的时候,我们经常需要知道两个文件之间,或者同一个文件不同版本之间有什么差异性.在 Windows 下有个很强大的工具叫作 BeyondCompare ,那在 Linu ...