题意:给出一个 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. HTML提交方式post和get区别(实验)

    HTML提交方式post和get区别(实验) 一.post和get区别 get提交,提交的信息都显示在地址栏中. post提交,提交的信息不显示地址栏中,显示在消息体中. 二.客户端代码 <!D ...

  2. spring boot 启动报错(spring-boot-devtools热部署后):The elements [spring.resources.cache-period] were left unbound. Update your application's configuration

    详细错误代码: *************************** APPLICATION FAILED TO START *************************** Descript ...

  3. tryparse

    [C#笔札]Tryparse的用法   这是参考读物的上得一个例子.自己仿照做的作业 private void button1_Click(object sender, EventArgs e) { ...

  4. 新概念 Lesson 5 How are you today

    How is Emma? 艾玛身体还好吗? 短语:very well How's Emma? She's very well, too. Emma is very well today   adv. ...

  5. linux使用flock文件锁

    使用linux flock 文件锁实现任务锁定,解决冲突 格式: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command flock ...

  6. Confluence 6 LDAP 服务器配置

    名字(Name) 输入一个有意义的 LDAP 服务器名字,会让你更好的识别你的目录服务器.例如: Example Company Staff Directory Example Company Cor ...

  7. 『PyTorch』第十六弹_hook技术

    由于pytorch会自动舍弃图计算的中间结果,所以想要获取这些数值就需要使用钩子函数. 钩子函数包括Variable的钩子和nn.Module钩子,用法相似. 一.register_hook impo ...

  8. iOS UI-集合视图(UICollectionView)

    BowenCollectionViewCell.xib #import <UIKit/UIKit.h> @interface BowenCollectionViewCell : UICol ...

  9. Docker安装及基础知识

    一.安装 & 启动 1.安装Docker [root@tokyo ~]# yum install docker 2.启动Docker服务 (1)旧式的 sysv 语法 [root@tokyo ...

  10. SSH 远程端口转发

    既然"本地端口转发"是指绑定本地端口的转发,那么"远程端口转发"(remote forwarding)当然是指绑定远程端口的转发. 还是接着看上面那个例子,ho ...