动态规划:ZOJ1074-最大和子矩阵 DP(最长子序列的升级版)
To the Max
Time Limit:1 Second Memory Limit:32768
KBProblem
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1 x 1 or greater located within the whole array. The sum of a rectangle is the sum of all the elements in that rectangle. In this problem the
sub-rectangle with the largest sum is referred to as the maximal sub-rectangle.
As an example, the maximal sub-rectangle of the array:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
is in the lower left corner:
9 2
-4 1
-1 8
and has a sum of 15.
The input consists of an N x N array of integers. The input begins with a single positive integer N on a line by itself, indicating the size of the square two-dimensional array. This is followed by N 2 integers separated by whitespace (spaces and newlines).
These are the N 2 integers of the array, presented in row-major order. That is, all numbers in the first row, left to right, then all numbers in the second row, left to right, etc. N may be as large as 100. The numbers in the array will be in the range [-127,127].Output
Output the sum of the maximal sub-rectangle.
Example
Input
4
0 -2 -7 0 9 2 -6 2
-4 1 -4 1 -1
8 0 -2
Output
15
解题心得:1、是一个很明显的动态规划,但是一开始的思路有点混乱,所以在处理的时候可以参照一下的方法:在输入的时候就将矩阵中的每一个数改写为同一行中前面I个数的和(这样才能处理子矩阵)。在处理列的时候数字就已经是行的和,这样就可以得到矩阵的和,所以处理子矩阵行的时候只能使用循环得出答案,记录最大的那个子矩阵。2、在做动态规划的题的时候首先要看出这个题是否可以用动态规划的思想来进行处理,在感觉普通思路行不通的时候可以试着用动态规划的思想来试试。3、在确定使用动态规划的时候就可以开始推动态转移(注意记录状态,先想最简单的转移,再逐步优化)的方程式,在数据不是很方便的时候可以改写一下数据。例如改写成 几 个数据的和,差。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 150;
int maps[maxn][maxn];
int main()
{
int n,sum,Max;
while(~scanf("%d",&n))
{
memset(maps,0,sizeof(maps));
Max = -1000000;
for(int i=1;i<=n;i++)//考虑为什么要从1开始输入
for(int j=1;j<=n;j++)
{
int t;
scanf("%d",&t);
maps[i][j] = maps[i-1][j] + t;//将每一个数改为每一列的和
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
sum = 0;
for(int k=1;k<=n;k++)
{
int K;
K = maps[j][k]-maps[i-1][k];
sum += K;//处理列的方法
sum = max(sum,0);//当sum小于0的时候可以直接舍去,参考最长子序列
Max = max(Max,sum);//记录最大的那个子矩阵的和
}
}
}
printf("%d\n",Max);
}
return 0;
}
动态规划:ZOJ1074-最大和子矩阵 DP(最长子序列的升级版)的更多相关文章
- ZOJ1074 (最大和子矩阵 DP)
F - 最大子矩阵和 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Descri ...
- HDU 1160 DP最长子序列
G - FatMouse's Speed Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64 ...
- nyoj 17-单调递增最长子序列 && poj 2533(动态规划,演算法)
17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:21 submit:49 题目描述: 求一个字符串的最长递增子序列的长度 如 ...
- HDU 4123 (2011 Asia FZU contest)(树形DP + 维护最长子序列)(bfs + 尺取法)
题意:告诉一张带权图,不存在环,存下每个点能够到的最大的距离,就是一个长度为n的序列,然后求出最大值-最小值不大于Q的最长子序列的长度. 做法1:两步,第一步是根据图计算出这个序列,大姐头用了树形DP ...
- 最长子序列dp poj2479 题解
Maximum sum Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 44476 Accepted: 13796 Des ...
- nyoj17-单调递增最长子序列-(dp)
17-单调递增最长子序列 内存限制:64MB 时间限制:3000ms 特判: No通过数:125 提交数:259 难度:4 题目描述: 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列 ...
- 动态规划(1)——最长子序列(LCS)问题
最长子序列问题:从中找出最长的字符序列,比如: cnblogs和belong.这两个字符串的最长子序列就是blog. 动态规划:通过分解大问题,不断的将大问题变成小问题,最终整合所有解,得出最优解(和 ...
- 算法:Common Subsequence(动态规划 Java 最长子序列)
Description A subsequence of a given sequence is the given sequence with some elements (possible non ...
- HDU 1513 最长子序列
Palindrome Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
随机推荐
- 4.0.3的mongodb 安装和java使用
一 整合 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的github项目地址 https://github.com/247292980/spring- ...
- 《C#高效编程》读书笔记04-使用Conditional特性而不是#if条件编译
#if/#endif语句常用来基于同一份源代码生成不同的编译结果,其中最常见的就是debug版和release版.但是这在实际应用中并不是非常友好,因为它们容易被滥用,其代码也难以理解或调试. C#为 ...
- hibernate课程 初探单表映射3-4 组件属性
本节内容: 1 简介组件属性 2 demo 1 简介组件属性: <component name = "address" class = "Address" ...
- form表单多文件上传
1.html/jsp主页 <%@ page language="java" contentType="text/html; charset=UTF-8" ...
- ArcGIS API for JavaScript开发初探——HelloMap
1.前言 在开始ArcGIS API for JavaScript开发之前我们需要了解一些基本的知识: 1.开发工具选什么? 前端技术的开发工具选择是一个仁者见仁智者见智的问题,有人喜欢Hbuilde ...
- Markdown引用图片,且不使用网上链接的解决方法
首先介绍下markdown使用图片的3种方法 使用本地图片,缺点是要用到本地的绝对路径,不适合对文档做迁移,否则会有图片链接失效的情况 方法总结
each()的作用是将数组当前元素的键值对拆成一个新数组,并把下一个元素作为当前元素.比如Array(...,'Robert'=>'Bob',...)中的'Robert'=>'Bob'键值 ...
- ios 几种快速写法
//NSString .... NSString *str1 = @"str1"; NSLog(@"str %@",str1); //NSArray NSArr ...