【Hihocoder1634】Puzzle Game(DP)
题意:有一个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)的更多相关文章
- 【ARC064-F】【XSY2575】Rotated Palindromes(DP)(字符串)
Description 然而,由于小C沉迷于制作游戏,他完全忘记了自己作为国家集训队的一员,还有156道作业题等他完成.还有一天作业就要截止了,而他一题还没有做.于是他赶紧挑了一道看起来最简单的题: ...
- 【HDU-6146】Pokémon GO(dp)
百度之星2017复赛1003 HDU-6146 Pokémon GO 题意 两行n列,只能到相邻格子,可以斜着.求遍历的方案数. 题解 dp[i]从一个点出发遍历长度i最后回到这一列的方案数 dp2[ ...
- 【CF1027E】Inverse Coloring(DP)
题意:给出一个n*n的矩阵,要求在每个位置涂上黑/白色, 要求满足:任意相邻的两行,其颜色要么完全相同,要么完全相反 任意相邻的两列,其颜色也要么相同要么完全相反 且这个矩形中,不存在任意一个大小大于 ...
- 【P2401】不等数列(DP)
这个题乍一看就应该是DP,再看一眼数据范围,1000..那就应该是了.然后就向DP的方向想,经过对小数据的计算可以得出,如果我们用f[i][j]来表示前i个数有j个是填了"<" ...
- 【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<= ...
- 【Vijos1534】高性能计算机(DP)
题意:有NA个A与NB个B两种任务需要完成,完成一段长度为X的A任务需要时间ta+ka*x*x,B任务类似,连续的同一种任务不能分成两段运行 有P台可以并行运算的计算机,求最快完成所有任务的时间 1≤ ...
- 【CF711C】Coloring Trees(DP)
题意:给你n个数字,一共有m种,如果某数为0则该数为空,空的地方可以填任意种类数,但每填一个数字都要花费一定的费用, 从头到尾,所有相邻且相同的数字看作一个集合,求使n个数字的集合数为k所需的最小费用 ...
- 【Luogu】P1410子序列(DP)
题目链接 我DP是真的菜啊啊啊啊啊! f[i][j]表示考虑前i个数,有i-j+1个数组成一个上升子序列,且不以i结尾的尾端最小值. 设a为j个数组成的序列,且以i结尾:b为i-j+1个数组成的序列, ...
- 【gym102394B】Binary Numbers(DP)
题意:From https://blog.csdn.net/m0_37809890/article/details/102886956 思路: 可以发现转移就是右上角的一个区间前缀和 std只要开1倍 ...
随机推荐
- Mybatis 插入一条或批量插入 返回带有自增长主键记录
首先讲一下, 插入一条记录返回主键的 Mybatis 版本要求低点,而批量插入返回带主键的 需要升级到3.3.1版本,3.3.0之前的都不行, <dependency> <grou ...
- 读取properties的简单方法,使用@Configuration
配置类代码如下 import org.springframework.beans.factory.annotation.Value; import org.springframework.contex ...
- Ubuntu12.04下YouCompleteMe安装教程(部分)
1.通过源码编译安装VIM 开发中使用的是Ubuntu 12.04 LTS,通过sudo apt-get install vim安装的版本较低,不支持YCM,所以,用源码编译并安装最新的Vim. 卸载 ...
- 循环(while、for)
写重复的代码是程序员最不耻的行为,那么如何做到不用写重复代码又能让程序重复一段代码多次呢,循环语句就派上用场拉…… 一.while 循环 # while 语法结构 while 条件: 执行代码.... ...
- 动态规划:HDU1003-Max Sum(最大子序列和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Su ...
- CSU-2007 Football Training Camp
Football Training Camp 在一次足球联合训练中一共有n支队伍相互进行了若干场比赛. 对于每场比赛,赢了的队伍得3分,输了的队伍不得分,如果为平局则两支队伍各得1分. Input 输 ...
- 8、python中的集合
集合是python中无序.可变的数据结构.集合与字典类似,集合中的元素必须是可哈希的(等同于字典中的键),也就是说集合中的元素是唯一.不可变的数据类型.这里前面说集合可变,后面又说集合中的元素不可变是 ...
- UVA1484 Alice and Bob's Trip (hdu3660)
一.前言 最开始卡这题是某大佬给出的树DP专题中的一个,据说类似于对抗搜索(这是啥?)的一题 但是在经历了若干艰难困苦之后发现这题在HDU上A不了——(先卡vector的时间,后卡输入的时间,上了输入 ...
- windows下pip安装python模块时报错【转】
windows下pip安装python模块时报错总结 请给作者点赞--> 原文链接 1 权限问题 C:\Users\ljf>pip install xlwt Exception: Trac ...
- 10,Scrapy简单入门及实例讲解
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...