hdu1081 To the Max

直接暴力枚举所有子矩形至少需要O(n^4)的复杂度,显然这不是一个合理的解决方法。

上述方案忽略了矩形之间的联系,进行了过多不必要的计算。

实际上如果固定矩形的左右边界,则底边在i行的矩形内数值之和与底边在i-1行的矩形的关系为 f[i] = s[i] + max(0, f[i - 1]), s[i]表示当前行对应的数值之和。

本题枚举是切入口,通过枚举把所有矩形分成左右边界固定的矩形族,而后再进行动态规划,可降低复杂度至O(n^3)。

acm.hdu.edu.cn/showproblem.php?pid=1081
 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4
 5 using namespace std;
 6 typedef __int64 LL;
 7
 8 const int inf = 0x3f3f3f3f;
 9 const int maxn = 100 + 10;
10
11 int n;
12 int s[maxn][maxn];
13
14 int main(){
15     while(~scanf("%d", &n)){
16         memset(s, 0, sizeof s);
17         for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%d", &s[i][j]);
18         for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) s[i][j] += s[i][j - 1];
19         int ans = -inf;
20         for(int i = 1; i <= n; i++){
21             //enumerate left boundary
22             for(int j = i; j <= n; j++){
23                 //enumerate right boundary
24                 int pre = -inf;
25                 for(int k = 1; k <= n; k++){
26                     //dynamic programming
27                     pre = s[k][j] - s[k][i - 1] + max(0, pre);
28                     ans = max(ans, pre);
29                 }
30             }
31         }
32         printf("%d\n", ans);
33     }
34     return 0;
35 }

时间: 2024-10-04 19:31:11

hdu1081 To the Max的相关文章

hdu1081 To the max(dp 矩阵压缩)

To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8947    Accepted Submission(s): 4323 Problem Description Given a two-dimensional array of positive and negative integers, a sub-rectang

hdu-1081 To The Max (最大子矩阵和)

http://acm.hdu.edu.cn/showproblem.php?pid=1081 To The Max Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10874    Accepted Submission(s): 5204 Problem Description Given a two-dimensional array

HDU1081 To The Max 最大子矩阵和

题意:求最大子矩阵和. 解题思路:枚举上下边界 ,用一维思路去搞. 解题代码: 1 // File Name: 1081.cpp 2 // Author: darkdream 3 // Created Time: 2015年04月01日 星期三 16时57分14秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #

HDU1081:To The Max(最大子矩阵,线性DP)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1081 自己真够垃圾的,明明做过一维的这种题,但遇到二维的这种题目,竟然不会了,我也是服了(ps:猪啊). 最终还是看了题解. 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #define inf 0x3f3f3f3f using namesp

区间Dp 暴力枚举+动态规划 Hdu1081

F - 最大子矩形 Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u Submit Status Description Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located withi

POJ3048 Max Factor

本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权!   Description To improve the organization of his farm, Farmer John labels each of his N (1 <= N <= 5,000) cows with a distinct s

自然语言处理中CNN模型几种常见的Max Pooling操作

/* 版权声明:可以任意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 CNN是目前自然语言处理中和RNN并驾齐驱的两种最常见的深度学习模型.图1展示了在NLP任务中使用CNN模型的典型网络结构.一般而言,输入的字或者词用Word Embedding的方式表达,这样本来一维的文本信息输入就转换成了二维的输入结构,假设输入X包含m个字符,而每个字符的Word Embedding的长度为d,那么输入就是m*d的二维向量. 图1 自然语言处理中CNN模型典型网络结构 这里可以

matlab max()

max()函数 (1)可以找出矩阵元素中每列的最大值 max(A) ,max(A,[],dim) ),带返回值的[C,I]=max(A).[C,I]=max(A,[],dim) (2)可以比较两个标量的大小 max(a1,a2) (3)可以表示矩阵元素与标量的比较 max(A,a) (4)可以比较两个同型矩阵的对应位置元素 max(A1,A2) 参考文献

5.7.2.2 min()和max()方法

Math对象还包含许多方法,用于辅助完成简单和复杂的数学计算. 其中,min()和max()方法用于确定一组数值中的最小值和最大值.这两个方法都可以接受任意多个数值参数,如下例子: var max = Math.max(3,54,32,16); alert(max);//54 var min = Math.min(3,54,32,16); alert(min);//3 对于3.54.32和16,Math.max()返回54,而Math.min()返回3.这两个方法经常用于避免多余的循环和在if语