题意:有一个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. GVIM——简直美如画,有没有!

    "========================================== " Author: wklken " Version: 9.1 " Em ...

  2. 四、MySQL 连接

    MySQL 连接 使用mysql二进制方式连接 您可以使用MySQL二进制方式进入到mysql命令提示符下来连接MySQL数据库. 实例 以下是从命令行中连接mysql服务器的简单实例: [root@ ...

  3. JS进阶篇--JS数组reduce()方法详解及高级技巧

    基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...

  4. 【转】JSP提交表单

    设计表单页面,它是静态页面,使用HTML编写,而且使用了JavaScript脚本语言来验证填写表单数据,表单页面为form.htm,代码如下: <html><head>< ...

  5. python各种操作列表的方法及案例

    一.循环的使用方法 names = ["张真","刘德华","哈林","谢霆锋","张柏芝"] fo ...

  6. Gearman任务分配

    Gearman 实现多数据库数据同步 测试环境:windows(mysql)+ 虚拟机(ubuntu + mysql)+ PHP 1:gearman 的官方文档可以了解gearman,在ubuntu中 ...

  7. JZOJ 5197. 【NOIP2017提高组模拟7.3】C

    5197. [NOIP2017提高组模拟7.3]C Time Limits: 1000 ms  Memory Limits: 262144 KB  Detailed Limits   Goto Pro ...

  8. MongDB之各种新增操作

    接口IMongDaoCreate: package com.net.test.mongdb.dao; import java.util.List; import com.net.test.mongdb ...

  9. 添加SQL字段

    通用式: alter table [表名] add [字段名] 字段属性 default 缺省值 default 是可选参数增加字段: alter table [表名] add 字段名 smallin ...

  10. 03012_会话技术Cookie&Session

    1.会话技术简介 (1)存储客户端的技术 网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户访问服务器端资源时,服务器并不知道该客户端是谁,所以需要会话技术识 ...