题目链接

题意:在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题的更多相关文章

  1. 2017北京赛区J题

    类型:三维动态规划 题目链接 题意: 合并连续石头块,最终要合并成一块,求时间最短,每次只能连续合并L~R块石头,不能合并成一块时输出-1 题解: 利用动态规划解决两种分问题 dp[l][r][k]: ...

  2. 2017北京国庆刷题Day1 afternoon

    期望得分:100+100+100=300 实际得分:100+100+100=300 T1 一道图论好题(graph) Time Limit:1000ms   Memory Limit:128MB 题目 ...

  3. XTU 1267 - Highway - [树的直径][2017湘潭邀请赛H题(江苏省赛)]

    这道题可能有毒……总之一会儿能过一会儿不能过的,搞的我很心烦…… 依然是上次2017江苏省赛的题目,之前期末考试结束了之后有想补一下这道题,当时比较懵逼不知道怎么做……看了题解也不是很懂……就只好放弃 ...

  4. 2017北京国庆刷题Day5 afternoon

    期望得分:100+60+100=260 实际得分:0+60+40=100 设图中有m个环,每个环有si条边,有k条边不在环中 ans= (2^s1 -2)*( 2^s2 -2)* (2^s3 -2)… ...

  5. 2017北京国庆刷题Day3 morning

    期望得分:100+60+0=160 实际得分:100+30+0=130 考场上用的哈希 #include<cstdio> #include<cstring> #include& ...

  6. HDU 6271 Master of Connected Component(2017 CCPC 杭州 H题,树分块 + 并查集的撤销)

    题目链接  2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块.    分块的时候满足每个块是一个 ...

  7. 2017北京国庆刷题Day4 morning

    期望得分:0+40+30=70 实际得分:0+10+10=20 题目修改:只能由0变1,只能用一次操作 大模拟 #include<cstdio> #include<cstring&g ...

  8. 2017湘潭大学邀请赛H题(树的直径)

    链接:https://www.icpc.camp/contests/4mYguiUR8k0GKE H. Highway The input contains zero or more test cas ...

  9. 2017北京国庆刷题Day7 morning

    期望得分:100+0+100=200 实际得分:100+20+0=120 离散化搞搞 #include<cstdio> #include<iostream> #include& ...

随机推荐

  1. 一幅图秒懂LoadAverage(转载)

    转自:http://www.habadog.com/2015/02/27/what-is-load-average/ 一幅图秒懂LoadAverage(负载)   一.什么是Load Average? ...

  2. Linux学习笔记之Xshell配色方案定制

    点击 Xshell 面板顶部的如下按钮. 点击 Browse 按钮,弹出如下面板,选择 ANSI Colors on Black,然后点击右侧save as 按钮,命名为 zkl.   这里其实就是复 ...

  3. axios配置大全

    一.安装 1. 利用npm安装npm install axios --save 2. 利用bower安装bower install axios --save 3. 直接利用cdn引入<scrip ...

  4. JavaScript&jQuery获取url参数方法

    JavaScript&jQuery获取url参数方法 function getUrlParam(name){ var reg = new RegExp("(^|&)" ...

  5. linux go with vscode

    1 install go apt install golang 将会同时安装下列软件:  golang-1.9 golang-1.9-doc golang-1.9-go golang-1.9-src ...

  6. 实现在vista和win7中使用管理员权限接收WM_DROPFILES(OnDropFiles())消息的方法(好像XP不支持这个函数)

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #pragma once   #ifndef WM_COPYGLOBALD ...

  7. 再也不学AJAX了!(三)跨域获取资源 ② - JSONP & CORS

    浏览器的"同源策略"固然保障了互联网世界的数据隐私与数据安全,但是如果当我们需要使用AJAX跨域请求资源时,"同源策略"又会成为开发者的阻碍.在本文中,我们会简 ...

  8. Python学习札记(二) python3.5安装 + (假装是)第一个Python程序

    参考: Mac OS 安装 Python3.5 廖雪峰Python教程:安装Python 笔记: 安装: 1.官方网站下载安装包:安装程序 2.执行安装程序完成Python3.5包的安装. 3.安装P ...

  9. (转帖) 为Docker容器指定自定义网段的固定IP/静态IP地址

    作者:雨水,日期:2016-04-09  CSDN博客: http://blog.csdn.net/gobitan 摘要:Docker容器运行的时候默认会自动分配一个默认网桥所在网段的IP地址.但很多 ...

  10. Java并发之synchronized深入

    一句话总结synchronized: JVM会自动通过使用monitor来加锁和解锁,保证了同时只有一个线程可以执行指定代码,从而保证了线程安全,同时具有可重入和不可中断的性质. 一.synchron ...