2017北京赛区H题
题目链接
题意:在n*m的矩阵中选择变换或者不变换一个数变成p,使得最大子矩阵和最小
1<=n,m<=150, -1000<=p<=1000;
题解:

他人题解链接
涉及到知识点求最大矩阵和 :
memset(ma,0x88,sizeof(ma));
memset(dp,0,sizeof(dp));
ans=-inf;
for(int i=1;i<=n;i++)
{
for(int l=1;l<=m;l++)
{
sum=0;
for(int r=l;r<=m;r++)
{
sum+=a[i][r];
dp[l][r]+=sum;
ma[l][r]=max(ma[l][r],dp[l][r]);
if(dp[l][r]<0)
dp[l][r]=0;
ans=max(ans,ma[l][r]);
}
}
}
往四个方向dp
#include<bits/stdc++.h>
using namespace std;
const int inf = 2e9+1e8;
const int N = 160;
int a[N][N];
int L[N],R[N],U[N],D[N],dp[N][N];
int ma[N][N];
int max4(int a,int b,int c,int d)
{
return max(max(a,b),max(c,d));
}
int n,m,p;
void solve()
{
int sum=0,tmp;
memset(ma,0x88,sizeof(ma));
memset(dp,0,sizeof(dp));
tmp=-inf;
for(int i=1;i<=n;i++)
{
for(int l=1;l<=m;l++)
{
sum=0;
for(int r=l;r<=m;r++)
{
sum+=a[i][r];
dp[l][r]+=sum;ma[l][r]=max(ma[l][r],dp[l][r]);
if(dp[l][r]<0)
{
dp[l][r]=0;
}
tmp=max(tmp,ma[l][r]);
}
}
U[i]=tmp;
}
memset(ma,0x88,sizeof(ma));
memset(dp,0,sizeof(dp));
tmp=-inf;
for(int i=n;i>=1;i--)
{
for(int l=1;l<=m;l++)
{
sum=0;
for(int r=l;r<=m;r++)
{
sum+=a[i][r];
dp[l][r]+=sum;ma[l][r]=max(ma[l][r],dp[l][r]);
if(dp[l][r]<0)
{
dp[l][r]=0;
}
tmp=max(tmp,ma[l][r]);
}
}
D[i]=tmp;
}
memset(ma,0x88,sizeof(ma));
memset(dp,0,sizeof(dp));
tmp=-inf;
for(int i=m;i>=1;i--)
{
for(int s=1;s<=n;s++)
{
sum=0;
for(int x=s;x<=n;x++)
{
sum+=a[x][i];
dp[s][x]+=sum;ma[s][x]=max(ma[s][x],dp[s][x]);
if(dp[s][x]<0)
{
dp[s][x]=0;
}
tmp=max(tmp,ma[s][x]);
}
}
R[i]=tmp;
}
memset(ma,0x88,sizeof(ma));
memset(dp,0,sizeof(dp));
tmp=-inf;
for(int i=1;i<=m;i++)
{
for(int s=1;s<=n;s++)
{
sum=0;
for(int x=s;x<=n;x++)
{
sum+=a[x][i];
dp[s][x]+=sum;ma[s][x]=max(ma[s][x],dp[s][x]);
if(dp[s][x]<0)
{
dp[s][x]=0;
}
tmp=max(tmp,ma[s][x]);
}
}
L[i]=tmp;
}
}
int main()
{
// int n,m,p;
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
memset(L,0x88,sizeof(L));
memset(R,0x88,sizeof(R));
memset(D,0x88,sizeof(D));
memset(U,0x88,sizeof(U));
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
solve();
int ans=D[1];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]<=p) continue;
int tmp=max4(L[j-1],R[j+1],U[i-1],D[i+1]);
tmp=max(tmp,D[1]-a[i][j]+p);
ans=min(ans,tmp);
}
}
printf("%d\n",ans);
}
return 0;
}
体会:巧妙利用预处理的方法降低复杂度,用空间去换时间,不要被模板给限制住思维。。。。比赛中一直用模板,使得思维变得僵硬
2017北京赛区H题的更多相关文章
- 2017北京赛区J题
类型:三维动态规划 题目链接 题意: 合并连续石头块,最终要合并成一块,求时间最短,每次只能连续合并L~R块石头,不能合并成一块时输出-1 题解: 利用动态规划解决两种分问题 dp[l][r][k]: ...
- 2017北京国庆刷题Day1 afternoon
期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms Memory Limit:128MB 题目 ...
- XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]
这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...
- 2017北京国庆刷题Day5 afternoon
期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...
- 2017北京国庆刷题Day3 morning
期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...
- HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)
题目链接 2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块. 分块的时候满足每个块是一个 ...
- 2017北京国庆刷题Day4 morning
期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...
- 2017湘潭大学邀请赛H题(树的直径)
链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE H. Highway The input contains zero or more test cas ...
- 2017北京国庆刷题Day7 morning
期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...
随机推荐
- 编码解码--三种常见字符编码简介:ASCII、Unicode和UTF-8
什么是字符编码? 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255( ...
- 一键安装lnmp(1)
#!/bin/bash#author:zhaocl#Software directory:$pathpath=`pwd`cd $path. $path/cacti.sh. $path/nginx.sh ...
- 学号20145303 《Java程序设计》第一周学习总结
学号20145303 <Java程序设计>第一周学习总结 教材学习内容总结 *dos命令行: dir:列出当前目录下的文件及文件名 md:创建目录 rd:删除目录.为空时文件夹(文件夹为空 ...
- ubifs文件系统挂载时提示ubi0: MTD device 5 is write-protected, attach in read-only mode
答:笔者遇到的这种情况是由于分区表未与nor flash的物理擦除块边界对齐而导致的,因此调整分区表即可解决此问题
- XML CDATA是什么?
XML CDATA是什么? 投稿:mdxy-dxy 字体:[增加 减小] 类型:转载 这篇文章主要为大家介绍下XML CDATA是什么,学习xml的朋友可以参考下 All text in ...
- C# 删除文件以及文件夹
代码如下: /// <summary> /// 删除文件夹以及文件 /// </summary> /// <param name="directoryPath& ...
- 【转】GitHub汉化脚本(谷歌浏览器)
// ==UserScript== // @name GitHub 汉化插件 // @description 汉化 GitHub 界面的部分菜单及内容. // @copyright 2016, 楼教主 ...
- python find命令、startwith命令
python的字符串有很多好用的操作,比如find,startswith命令. 这几个命令在处理配置文件的时候很有用,比如用startswith判断是否是注释行. 注意:几个函数的返回值是不同滴. 函 ...
- spring boot2.1读取 apollo 配置中心2
第二篇:创建spring boot2.1项目 引用apollo的java客户端jar包 <dependency> <groupId>com.ctrip.framework.ap ...
- 使用HandleErrorAttribute处理异常
ASP.NET MVC 默认提供了一个异常过滤器HandleError特性,使用该特性可以极为方便的捕捉并处理控制器和操作抛出的异常,也可以将此特性注册为全局异常过滤器从而捕捉项目中的所有异常.如果想 ...