题意:给出一个 n * n 的数字矩阵,问最大子矩阵和是多少。

由于和最长子段和问题类似,一开始想到的就是 DP ,一开始我准备用两个循环进行 DP ,对于每一个 (i,j) ,考察(i - 1,j)与(i,j - 1), dp 值代表以该点为右下角的最大矩阵和,同时记录下这个矩阵的左上角坐标,状态转移时通过将原和最大矩阵通过补边推到当前和最大矩阵。但是其实这种做法有一个明显的问题,就是转移时,补上边后 dp 值相同怎么办,dp 值相同而矩阵不同的话会影响到下一次状态转移后补上的矩阵的情况,从而影响到下一个矩阵的判断。

并想不出怎么做的我无奈看了题解……二维压缩,好吧,并不懂那是个什么……细看之下才知道,其实就是用数组记录下矩阵后,在 dp 时对于起始结束行不同的矩阵分别 DP ,记录下其中最大值即可。例如对于所有列,考虑其前两行的情况,即子矩阵行数为 2 ,这时每列的两个数可以计算其和为一个数,就能将二维的矩阵转化为一维的数组了,这样再进行与最长子段和相同的操作就能得出答案了。

当然,记录矩阵并且便于计算行之间的和,我用了前缀和数组和树状数组两种方式。这题明显用前缀和数组更加好,因为输入的数不会发生改变,所以前缀和数组更加容易计算,用树状数组做并不是用来体现我的逼格高,只是因为我个人树状数组基本没有在题目中用过几次,所以这次敲一遍训练一下,以免以后遇到了明明会但是敲不出来或者敲得太慢……说白了就是弱……

前缀和数组:

 #include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b int t[][],dp[]; int main(){
int n;
while(scanf("%d",&n)!=EOF&&n!=){
int i,j,k,ans=-0xFFFFFFF,tmp;
memset(t,,sizeof(t));
for(i=;i<=n;i++){
for(j=;j<=n;j++){
scanf("%d",&tmp);
t[j][i]=t[j][i-]+tmp;
}
}
for(i=;i<=n-;i++){
for(j=i+;j<=n;j++){
memset(dp,,sizeof(dp));
for(k=;k<=n;k++){
if(dp[k-]>){
dp[k]=dp[k-]+(t[k][j]-t[k][i]);
}
else dp[k]=t[k][j]-t[k][i];
ans=max(ans,dp[k]);
}
}
}
printf("%d\n",ans);
}
return ;
}

树状数组:

 #include<stdio.h>
#include<string.h>
#define max(a,b) a>b?a:b int t[][],dp[],n; void add(int i,int j,int d){
while(j<=n){
t[i][j]+=d;
j+=(j&-j);
}
return;
} int sum(int k,int x){
int cnt=;
while(x>){
cnt+=t[k][x];
x-=(x&(-x));
}
return cnt;
} int main(){
while(scanf("%d",&n)!=EOF&&n!=){
int i,j,k,ans=-0xFFFFFFF,tmp;
memset(t,,sizeof(t));
for(i=;i<=n;i++){
for(j=;j<=n;j++){
scanf("%d",&tmp);
add(i,j,tmp);
}
}
for(i=;i<=n-;i++){
for(j=i+;j<=n;j++){
memset(dp,,sizeof(dp));
for(k=;k<=n;k++){
tmp=sum(k,j)-sum(k,i);
if(dp[k-]>){
dp[k]=dp[k-]+tmp;
}
else dp[k]=tmp;
ans=max(ans,dp[k]);
}
}
}
printf("%d\n",ans);
}
return ;
}

hdu1081 DP类最大子段和(二维压缩+前缀和数组/树状数组计数)的更多相关文章

  1. Codeforces Good Bye 2015 D. New Year and Ancient Prophecy 后缀数组 树状数组 dp

    D. New Year and Ancient Prophecy 题目连接: http://www.codeforces.com/contest/611/problem/C Description L ...

  2. BZOJ3132 上帝造题的七分钟 【二维树状数组】

    题目 "第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的 ...

  3. 二维偏序+树状数组【P3431】[POI2005]AUT-The Bus

    Description Byte City 的街道形成了一个标准的棋盘网络 – 他们要么是北南走向要么就是西东走向. 北南走向的路口从 1 到 n编号, 西东走向的路从1 到 m编号. 每个路口用两个 ...

  4. 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019

    题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...

  5. 树状数组优化DP 【模拟赛】删区间

    哇,难受得一匹. 看到题的一瞬间竟然只想到了\(n^3\)的区间\(DP\) 一.\(40pts\) 设\(f[i][j]\)代表删去\(i\)到\(j\)这一段区间的最小代价和. 然后直接写普通的区 ...

  6. 第十四个目标(dp + 树状数组 + 线段树)

    Problem 2236 第十四个目标 Accept: 17    Submit: 35 Time Limit: 1000 mSec    Memory Limit : 32768 KB  Probl ...

  7. URAL1523(dp+树状数组)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=41224#problem/B 分析:可以设dp[i][j]表示以i结尾长度为j的 ...

  8. hdu 3030 Increasing Speed Limits (离散化+树状数组+DP思想)

    Increasing Speed Limits Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java ...

  9. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

随机推荐

  1. 丑数问题 Ugly Number

    2018-07-28 15:30:21 一.判断是否为丑数 问题描述: 问题求解: 所谓丑数,首先得是正数,然后其质数因子只包含了2,3,4,因此我们只需要对当前的数分别除2,3,4直到不能除为止. ...

  2. C# 通过Newtonsoft.Json.dll序列化日期的处理

    Newtonsoft.Json.dll提供了非常好的Json序列化和反序列化方式,但是对日期的处理却让我纠结了很久.首先定义类如下: public class Student{ public int ...

  3. php安装时开启很多扩展,如果忘了开启某些扩展,以后还能加上吗?答案是可以的

    php配置时,这里面开启了很多扩展.如果这时候忘了开启,以后还能加上吗?答案是可以的.以后只需要进入源码的ext目录,例如忘了pdo_mysql,进入ext/pdo_mysql,使用phpize工具, ...

  4. <yii 框架学习> yii 框架改为中文提示

    工作需要用到yii框架,但发现yii框架自带的提示都是英文的.上网找资料才发现其实可以自己陪置 . 将项目protected/config/main.php里的app配置加上language=> ...

  5. mRNA基本概念

    mRNA是由DNA的一条链转录而来的(可以是正链,也可以是反链),DNA是由非编码区和编码区组成,编码区也有其特殊的结构,主要有外显子和内含子组成. mRNA的一个重要性质就是可变剪切,也就是同一个编 ...

  6. English trip -- VC(情景课) 7 D Reading 阅读练习

    Read Hi patty, This morning, Smuel and I are going to The Clothes place. Samuel needs blue pants.He ...

  7. Jersey 2.x 基于 Servlet 的服务器端应用

    下面的依赖通常应用到应用服务器上(servlet 容器),同时这个应用服务器上没有整合任何 JAX-RS 的实现. 因此,这个应用服务器需要包含有 JAX-RS API 和 Jersey 实现,同时部 ...

  8. bzoj1834: [ZJOI2010]network 网络扩容 费用流

    bzoj1834 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用. 求: 1.在不扩容的情况下,1到N的最大流: 2.将1到N的最大流增加K所需的最小扩容 ...

  9. Multi-target tracking by Lagrangian relaxation to min-cost network flow

    Multi-target tracking by Lagrangian relaxation to min-cost network flow high-order constraints min-c ...

  10. hdu 1069 DAG加权

    题目: Monkey and Banana Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot ...