题目链接:(vjudge) 戳我

和上面那个matrix 比较像。

大概题意就是给你一个n*m的矩阵,然后可以选择其中一个数字进行修改(当然也可以不修改),使得矩阵的最大子矩阵尽可能小。最后输出这个值。

我们\(n^2\)遍历i,j,对于一个位置\([i,j]\)看看如果对它进行更改结果会如何。显然如果p值大于该节点的数,我们可以选择不更改。

我们考虑修改了位置为i,j的一个数后,剩下的最大子矩阵会有什么情况?

这里进行分类讨论,第一类是不选择这个数字了。之后最大子矩阵就有“在它左边”,“在它右边”,“在它上面”,“在它下面”四种情况了。而这四种情况对应的最大子矩阵和显然我们可以通过预处理计算出来。

第二类是仍然选择这个数字,这个比较简单,直接对原来矩阵的最大子矩阵和进行更改即可。

代码如下:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#define MAXN 310
using namespace std;
int n,m,p,ans,ansans,all;
int a[MAXN][MAXN],up[MAXN],down[MAXN],ll[MAXN],rr[MAXN],sum[MAXN],dp[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("ce.in","r",stdin);
#endif
while(scanf("%d%d%d",&n,&m,&p)!=EOF)
{
memset(a,0,sizeof(a));
for(int i=0;i<=300;i++)
ll[i]=rr[i]=up[i]=down[i]=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]);
memset(dp,0,sizeof(dp));
for(int l=1;l<=n;l++)
{
memset(sum,0,sizeof(sum));
for(int r=l;r<=n;r++)
{
int cur_ans=-0x3f3f3f3f;
for(int i=1;i<=m;i++)
{
if(l==r) sum[i]=a[r][i];
else sum[i]+=a[r][i];
dp[i]=max(dp[i-1]+sum[i],sum[i]);
cur_ans=max(dp[i],cur_ans);
}
for(int i=r;i<=n;i++) up[i]=max(up[i],cur_ans);
for(int i=1;i<=l;i++) down[i]=max(down[i],cur_ans);
}
}
memset(dp,0,sizeof(dp));
for(int l=1;l<=m;l++)
{
memset(sum,0,sizeof(sum));
for(int r=l;r<=m;r++)
{
int cur_ans=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(l==r) sum[i]=a[i][r];
else sum[i]+=a[i][r];
dp[i]=max(dp[i-1]+sum[i],sum[i]);
cur_ans=max(cur_ans,dp[i]);
}
for(int i=r;i<=m;i++) ll[i]=max(ll[i],cur_ans);
for(int i=1;i<=l;i++) rr[i]=max(rr[i],cur_ans);
}
}
//for(int i=1;i<=n;i++)printf("i=%d ll=%d rr=%d up=%d down=%d\n",i,ll[i],rr[i],up[i],down[i]);
ansans=up[n];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]<p) continue;
ans=-0x3f3f3f3f;
ans=max(ans,max(max(up[i-1],down[i+1]),max(ll[j-1],rr[j+1])));
ans=max(ans,down[1]-a[i][j]+p);
ansans=min(ansans,ans);
}
}
printf("%d\n",ansans);
}
}

hihocoder1634 Puzzle Game的更多相关文章

  1. 【Hihocoder1634】Puzzle Game(DP)

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

  2. Puzzle 面向服务/切面(AOP/IOC)开发框架 For .Net

    Puzzle 面向服务/切面AOP开发框架 For .Net AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效 ...

  3. HDU5456 Matches Puzzle Game(DP)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5456 Description As an exciting puzzle game for ...

  4. one recursive approach for 3, hdu 1016 (with an improved version) , permutations, N-Queens puzzle 分类: hdoj 2015-07-19 16:49 86人阅读 评论(0) 收藏

    one recursive approach to solve hdu 1016, list all permutations, solve N-Queens puzzle. reference: t ...

  5. poj3678 Katu Puzzle 2-SAT

    Katu Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6714   Accepted: 2472 Descr ...

  6. POJ1651Multiplication Puzzle[区间DP]

    Multiplication Puzzle Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8737   Accepted:  ...

  7. codeforce B Island Puzzle

    B. Island Puzzle time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. poj 1651 Multiplication Puzzle (区间dp)

    题目链接:http://poj.org/problem?id=1651 Description The multiplication puzzle is played with a row of ca ...

  9. Ignatius's puzzle

    Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

随机推荐

  1. Elasticsearch-2.4.3的单节点安装(多种方式图文详解)

    前提: Elasticsearch-2.4.3的下载(图文详解) 1.新建es安装目录 [root@djt002 local]# mkdir elasticsearch [root@djt002 lo ...

  2. [Android]RecyclerView添加HeaderView出现宽度问题

    通过getItemViewType方式判断HeaderView方式添加HeaderView的,结果发现有几个界面HeaderView宽度不能满屏. 于是对比了几种布局,发现LinearLayout为根 ...

  3. Lambda表达式在Android开发中的应用

    在Java8中拥有Lambda表达式的新功能,如果现在Android项目中使用,首先,必须在项目中的build.gradle配置一下 使用Lambda表达式必须满足只有一个待实现方法这个规则,否则就不 ...

  4. OpenGL位图函数

    [OpenGL位图函数] 1.OpenGL中glBitmap用于绘制一个二值阵列. When drawn, the bitmap is positioned relative to the curre ...

  5. 使用Windows绘图合成多张图

    [使用Windows绘图合成多张图] 1.点击图片右键选择打开方式→选择画图工具打开图片. 2.这时图片可以改变外框大小,将外框尽量弄大些. 3.点击编辑选中下拉菜单中的粘贴来源,选择需要增加进来的图 ...

  6. VUE+WebPack游戏开发:神庙逃亡的游戏设计

  7. 解剖Nginx·模块开发篇(1)跑起你的 Hello World 模块!

    1 学习 Nginx 模块开发需要有哪些准备? 需要的预备知识不多,有如下几点: 有过一些 C 语言的编程经历: 知道 Nginx 是干嘛的,并有过编写或改写 Nginx 的配置文件的经历. OK,就 ...

  8. [erlang 002]gen_server中何时会跑到terminate函数

    一.从start方法产出的独立gen_server进程 实验代码: %%%-------------------------------------- %%% @Module  : %%% @Auth ...

  9. htaccess跨域

    目的:为了加快访问速度,减轻主站压力,把静态资源放到独立的服务器上,使用独立的域名 问题:浏览器为安全考虑,实施同源策略:ip/域名和端口必须相同 解决办法: 1.httpd.conf中,开启apac ...

  10. Hive入门学习随笔(二)

    ====使用Load语句执行数据的导入 --将操作系统上的文件student01.txt数据导入到t2表中 load data local inpath '/root/data/student01.t ...