题目链接

题意:在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. 浅析SQL注入

    body, td { font-family: calibri; font-size: 10pt; } 演示 记得以前瞎鼓捣的时候,学过一个传说中的SQL注入万能字符串,是这个样子的' or '1'= ...

  2. 【VS Error】VS2008在编译时出现:Error 15 Cannot register assembly

    现象: 在visual studio 2008在编译类库时提示如下错误: Error 15 Cannot register assembly "D:\01_Work\02_SVN\OCRpl ...

  3. ubuntu环境下nginx的编译安装以及相关设置

    一.基本的编译与安装 1.安装依赖项 sudo apt-get update sudo apt-get install build-essential zlib1g-dev libpcre3 libp ...

  4. 数据库还原,System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权。 (Microsoft.SqlServer.SmoExtended)

    数据库还原问题: System.Data.SqlClient.SqlError: 因为数据库正在使用,所以无法获得对数据库的独占访问权. (Microsoft.SqlServer.SmoExtende ...

  5. 几种创建XMLHttpRequest对象的方法

    XMLHttpRequest对象,也就是Ajax交互的核心对象. 这里列举三种创建Ajax对象的方法. 第一种: <!DOCTYPE html> <html> <head ...

  6. Nagios安装完后status map,trends等页面访问出错之解决

    首先,可以进入/usr/local/nagios/sbin, [root@localhost sbin]# ldd statusmap.cgi linux-vdso.so. => (0x0000 ...

  7. C# winfrom listview 多窗口调用

    Form1 private void button1_Click(object sender, EventArgs e) { Form f = new Form2(ref listView1); f. ...

  8. static、final和finalize详解

    一.static 修饰符 数据共享 成员变量(实例变量)和静态变量(类变量)的区别 两个变量的生命周期不同 成员变量随对象的创建而存在,随对象被回收而释放 静态变量随类的加载而存在,随类的消失而消失 ...

  9. 修饰器Decorator

    类的修饰 许多面向对象的语言都有修饰器(Decorator)函数,用来修改类的行为.目前,有一个提案将这项功能,引入了 ECMAScript. @testable class MyTestableCl ...

  10. linux基础之Vim