题意:有一个n*m的矩阵,每个矩阵里有一个数字a[i][j]。现在要求将其中一个格子的值改为p,使得修改后矩阵的最大子矩阵和最小,求这个最小值

n,m<=150,abs(a[i][j])<=1e3

思路:学习cf,也把这种题叫DP了……

考虑如何快速求出修改后最大子矩阵的值

最大子矩阵有一个O(n^3)的写法:枚举所处的两行或两列,剩下的就当做最大子串做

用这样的方法预处理出上下左右四个方向的最大子矩阵之后,枚举任意一个原最大子矩阵中每个点是否修改

如果有多个最大子矩阵除非枚举到重叠部分否则答案不会改变

枚举后的答案即为原最大子矩阵的值修改后的值与上下左右四个方向的max取max

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<bitset>
typedef long long ll;
using namespace std;
#define N 160
#define oo 10000000
#define MOD 100000073 int s[N][N],a[N][N],U[N],D[N],L[N],R[N]; int calc(int x1,int y1,int x2,int y2)
{
return s[x2][y2]-s[x1-][y2]-s[x2][y1-]+s[x1-][y1-];
} int main()
{
//freopen("hihocoder1634.in","r",stdin);
//freopen("hihocoder1634.out","w",stdout);
int n,m,p;
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) scanf("%d",&a[i][j]);
memset(s,,sizeof(s));
for(int i=;i<=n+;i++) U[i]=D[i]=-oo;
for(int i=;i<=m+;i++) L[i]=R[i]=-oo;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++) s[i][j]=s[i-][j]+s[i][j-]-s[i-][j-]+a[i][j];
int ans=-oo;
for(int i=;i<=n;i++)
{
int tmp=-oo;
for(int j=;j<=i;j++)
{
int t=;
for(int k=;k<=m;k++)
{
t+=calc(j,k,i,k);
tmp=max(tmp,t);
if(t<) t=;
}
}
U[i]=max(U[i-],tmp);
ans=max(ans,U[i]);
} for(int i=n;i>=;i--)
{
int tmp=-oo;
for(int j=i;j<=n;j++)
{
int t=;
for(int k=;k<=m;k++)
{
t+=calc(i,k,j,k);
tmp=max(tmp,t);
if(t<) t=;
}
}
D[i]=max(D[i+],tmp);
} for(int i=;i<=m;i++)
{
int tmp=-oo;
for(int j=;j<=i;j++)
{
int t=;
for(int k=;k<=n;k++)
{
t+=calc(k,j,k,i);
tmp=max(tmp,t);
if(t<) t=;
}
}
L[i]=max(L[i-],tmp);
} for(int i=m;i>=;i--)
{
int tmp=-oo;
for(int j=m;j>=i;j--)
{
int t=;
for(int k=;k<=n;k++)
{
t+=calc(k,i,k,j);
tmp=max(tmp,t);
if(t<) t=;
}
}
R[i]=max(R[i+],tmp);
} int sx=,sy=,ex=,ey=;
for(int i=;i<=n;i++)
for(int j=i;j<=n;j++)
{
if(sx) break;
int tmp=-oo;
int t=;
int st=;
for(int k=;k<=m;k++)
{
t+=calc(i,k,j,k);
tmp=max(tmp,t);
if(tmp==ans)
{
sx=i; ex=j;
sy=st; ey=k;
break;
}
if(t<)
{
t=;
st=k+;
}
}
}
//printf("ans=%d\n",ans);
//printf("%d %d %d %d\n",sx,sy,ex,ey);
int cnt=ans;
for(int i=sx;i<=ex;i++)
for(int j=sy;j<=ey;j++) cnt=min(cnt,max(ans-a[i][j]+p,max(max(max(U[i-],D[i+]),L[j-]),R[j+])));
printf("%d\n",cnt);
}
return ;
}

【Hihocoder1634】Puzzle Game(DP)的更多相关文章

  1. 【ARC064-F】【XSY2575】Rotated Palindromes(DP)(字符串)

    Description 然而,由于小C沉迷于制作游戏,他完全忘记了自己作为国家集训队的一员,还有156道作业题等他完成.还有一天作业就要截止了,而他一题还没有做.于是他赶紧挑了一道看起来最简单的题: ...

  2. 【HDU-6146】Pokémon GO(dp)

    百度之星2017复赛1003 HDU-6146 Pokémon GO 题意 两行n列,只能到相邻格子,可以斜着.求遍历的方案数. 题解 dp[i]从一个点出发遍历长度i最后回到这一列的方案数 dp2[ ...

  3. 【CF1027E】Inverse Coloring(DP)

    题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色, 要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反 任意相邻的两列,其颜色也要么相同要么完全相反 且这个矩形中,不存在任意一个大小大于 ...

  4. 【P2401】不等数列(DP)

    这个题乍一看就应该是DP,再看一眼数据范围,1000..那就应该是了.然后就向DP的方向想,经过对小数据的计算可以得出,如果我们用f[i][j]来表示前i个数有j个是填了"<" ...

  5. 【Vijos1222】等值拉面(DP)

    题意:有N个数对(a[i],b[i]) 每次可以把(x,y)变成(x+a[i],y+b[i])或(x+b[i],x+a[i]),后者称为交换一次 求使abs(x-y)最小时的最小交换次数 n<= ...

  6. 【Vijos1534】高性能计算机(DP)

    题意:有NA个A与NB个B两种任务需要完成,完成一段长度为X的A任务需要时间ta+ka*x*x,B任务类似,连续的同一种任务不能分成两段运行 有P台可以并行运算的计算机,求最快完成所有任务的时间 1≤ ...

  7. 【CF711C】Coloring Trees(DP)

    题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...

  8. 【Luogu】P1410子序列(DP)

    题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列, ...

  9. 【gym102394B】Binary Numbers(DP)

    题意:From https://blog.csdn.net/m0_37809890/article/details/102886956 思路: 可以发现转移就是右上角的一个区间前缀和 std只要开1倍 ...

随机推荐

  1. 微信小程序text标签

    最近在做小程序,使用<text>标签的时候发现里面的文本text-family不生效, 经过试验,发现直接在text标签的class设置不生效,可以在外层包一个父元素就可以设置了. < ...

  2. celery:Unrecoverable error: AttributeError("'unicode' object has no attribute 'iteritems')

    环境描述 python2+django1.9下使用celery异步处理耗时请求. celery使用的是celery-with-redis这个第三方库,版本号为3.0. pip install cele ...

  3. Scrapy-redis分布式爬虫爬取豆瓣电影详情页

    平时爬虫一般都使用Scrapy框架,通常都是在一台机器上跑,爬取速度也不能达到预期效果,数据量小,而且很容易就会被封禁IP或者账号,这时候可以使用代理IP或者登录方式爬,然而代理IP很多时候都很鸡肋, ...

  4. Keepalivaed +Nginx proxy 高可用架构方案与实施过程细节

    1.开源产品介绍 1)CMS介绍 官方网站http://www.dedecms.com/,是一个网站应用系统构建平台,也是一个强大的网站内容管理系统,既可以用来构建复杂的体系的企业信息门户或者电子商务 ...

  5. mysql中为int设置长度究竟是什么意思

    根据个人的实验并结合资料:1.长度跟可以使用的值的范围无关,值的范围仅跟类型对应的存储字节数和是否unsigned有关:2.长度指的是显示宽度,比如,指定3位int,那么id为3和id为300的值,在 ...

  6. 如何在Linux下使用Rsync

    如何在Linux下使用Rsync 吐槽 昨天对scp进行总结之后看到最后有说到Rsync,俗语有云:好奇心害死猫.抱着学习的态度将Rsync给找了出来,然后进行了一些简单的学习.下面介绍一些个常用的命 ...

  7. CSC.exe(C#编译器命令行)

    不要在普通的命令行窗口中编译,请先打开C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Microsoft Visual Studio 2010 ...

  8. Python3.0-3.6的版本变化

    Table of Contents Python3.0 简单的变化 语法的变化 新语法 改动的语法 剩下的变化 Python3.1 Python3.2 Python3.3 Python3.4 Pyth ...

  9. CentOS7 haproxy+keepalived实现高可用集群搭建

    一.搭建环境 CentOS7 64位 Keepalived 1.3.5 Haproxy 1.5.18 后端负载主机:192.168.166.21 192.168.166.22 两台节点上安装rabbi ...

  10. nmon系统监控

    nmon系统监控篇 本文目录 1 nmon的安装 2 nmon控制台指令 3 输出监控文件 一 下载nmon 本次使用的是nmon_linux_14i.tar.gz 二 放入linux中后解压 gzi ...