POJ1050:To the max
poj1050:http://poj.org/problem?id=1050
* maximum-subarray 问题的升级版本~
本题同样是采用DP思想来做,同时有个小技巧处理:就是把二维数组看做一维数组。怎么去看呢,我们可以吧具有同样列号的数捆绑到一起,比如 a[1][1], a[2][1], a[3][1]....。我们可以吧他们都看做 'a[1]'。因为最终的解是矩阵行数n中的任意一段,比如说:第p行到第q行, (1<=p<=q<=n), 我们要得到最终解,就一定要逐一枚举p,q。
* 如果p==q的话,就说明当前考察的矩阵只有一行,所以问题就很简单啦,在这一行上利用maximum-subarray DP解法就可以得到子矩阵a[p或者q][1...n]的最大和S1。
* 如果p!=q时,说明考察的巨狠是多行的,为了把多行变成‘一行‘,我们可以吧从p行到q行的矩阵同一列的值相加,比如:
第p行: a[p][1], a[p][2], .... , a[p][n]
第p+1行:a[p+1][1], a[p+1][2], ... , a[p+1][n]
..........
第q行: a[q][1], a[q][2], ... , a[q][n]
相加---!> a[p][1]+...+a[q][1] , ... , a[p][n]+...+a[q][n]
这样我们在这个新的一维矩阵上又可以进行maximum-subarray DP解法,得到最大和S2。
并且每一次枚举p,q时得到的S1或者S2,我们都要和最终结果ans进行比较,将其中较大的值存入ans中。
细节看代码:
1 #include<iostream>
2 #include<algorithm>
3 #include<cstdio>
4 #include<cstring>
5 using namespace std;
6 const int max_size=101;
7 const int inf=(1<<30);
8 int a[max_size][max_size];
9 int n;
10 int main(){
11 scanf("%d",&n);
12 memset(a,0,sizeof(a));
13 for(int i=1;i<=n;i++){
14 for(int j=1;j<=n;j++){
15 scanf("%d",&a[i][j]);
16 if(i>=2) a[i][j]+=a[i-1][j];
17 }
18 }
19 //int *tmp=new int[(n+1)*n][m+1];
20 int ans=-inf,sum;
21 for(int i=1;i<=n;i++){
22 //memset(tmp,0,sizeof(tmp));
23 for(int j=i;j<=n;j++){
24 if(j==i) sum=a[i][1];
25 else sum=a[j][1]-a[i-1][1];
26 for(int k=2;k<=n;k++){
27 if(j==i){
28 if(sum>0){
29 sum+=a[i][k];
30 }
31 else{
32 sum=a[i][k];
33 }
34 if(sum>ans) ans=sum;
35 }
36 else{
37 if(sum>0){
38 sum+=a[j][k]-a[i-1][k];
39 }
40 else{
41 sum=a[j][k]-a[i-1][k];
42 }
43 if(sum>ans) ans=sum;
44 }
45 }
46 }
47 }//end for
48 printf("%d\n",ans);
49 }
POJ1050:To the max的更多相关文章
- 页面上有3个输入框:分别为max,min,num;三个按钮:分别为生成,排序,去重;在输入框输入三个数字后,先点击生成按钮,生成一个数组长度为num,值为max到min之间的随机整数点击排序,对当前数组进行排序,点击去重,对当前数组进行去重。 每次点击之后使结果显示在控制台
<!DOCTYPE html> <html> <head> <!-- 页面上有3个输入框:分别为max,min,num:三个按钮:分别为生成,排序,去重: 在 ...
- 【poj1050】 To the Max
http://poj.org/problem?id=1050 (题目链接) 题意 求二维最大子矩阵 Solution 数据好像很水,N最大才100,N^4大暴力都可以随便水过. 其实有N^3的做法.枚 ...
- C语言:min和max头文件
转自:http://www.cppblog.com/jince/archive/2010/09/14/126600.html min和max头文件 虽然说求最大值最小值函数在哪个头文件下并不是非常重要 ...
- HDU1081:To The Max(最大子矩阵,线性DP)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1081 自己真够垃圾的,明明做过一维的这种题,但遇到二维的这种题目,竟然不会了,我也是服了(ps:猪啊). ...
- 【LeetCode】:二叉树的Max,Min深度
一.最大深度问题 描述: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes a ...
- POJ 1050:To the Max
To the Max Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 43241 Accepted: 22934 Desc ...
- 聚合函数:sum,avg,max,min,count
group by 分组的使用方法 数学函数:ABS.ceiling.floor.power.round.sqrt.square 练习:
- SQL2005:使用varchar(max)代替text
SQL Server 2005 联机丛书 中文相关说明 1.在 Microsoft SQL Server 的未来版本中将删除 ntext.text 和 image 数据类型.请避免在新开发工作中使用这 ...
- 数据结构:HDU 2993 MAX Average Problem
MAX Average Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
随机推荐
- C#中日期时间的简单操作
(1).比较2个DateTime的大小 DateTime dt1 = Convert.ToDateTime("2010/11/25 20:53:43"); DateTime dt2 ...
- C语言自带的快速排序(qsort)函数使用方法
感觉打快排太慢了,找到了c语言自带的函数.这函数用起来没c++的方便,不过也够了. 函数名称:qsort,在头文件:<stdlib.h>中 不多说,上代码: #include <st ...
- 在Windowx下创建以点开头的.hatccess文件
转自:在Windowx下创建以点开头的.hatccess文件 Windows有些目录名是不能创建的,有一些文件按照常规方式也是不能创建的,如在Windows下创建文件夹名为con的目录就不行,在win ...
- iOS8定位问题
正文:主要解决iOS8以前能定位,但是在iOS8时候无法定位的问题 在iOS8以前,我们的GPS定位是在用户设置的里面显示的是总是使用,但是在iOS8以后,苹果修改了这部分授权,你需要多加入2个pli ...
- python eval函数
eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果. 可以把字符串转为list.tuple .dict 等数据类型 1.把字符串转为字典 ####### ...
- 软媒魔方u盘装系统
http://jingyan.baidu.com/article/d5a880eb6e747e13f147ccd6.html
- HDU 1025 Constructing Roads In JGShining's Kingdom(DP+二分)
点我看题目 题意 :两条平行线上分别有两种城市的生存,一条线上是贫穷城市,他们每一座城市都刚好只缺乏一种物资,而另一条线上是富有城市,他们每一座城市刚好只富有一种物资,所以要从富有城市出口到贫穷城市, ...
- HDU4528+BFS
/* bfs+标记状态 如何记录状态是关键!! */ #include<stdio.h> #include<string.h> #include<stdlib.h> ...
- Jmeter使用——参数化
最近一个想项目使用jmeter进行测试,陆续将遇到并解决的问题记录下来,本次主要记录参数化得一些问题. 1. 单台压力机 多个线程组不重复数字,注意分布式负载时多个压力机会出现重复的问题 主要思路分别 ...
- CC_UNUSED_PARAM 宏含义的解释
#define CC_UNUSED_PARAM(unusedparam) (void)unusedparam 这个宏完全没有执行任何命令,这样写的原因主要是历史遗留原因,ojb-c不存在纯虚函数并且传 ...