题目链接:(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. 【303】C# 复制窗体 & 修改名称

    参考:C#复制粘贴窗体 参考:VS修改项目解决方案名称 一.复制窗体 在“解决方案资源管理器”(以下简称:管理器)中选择要复制的窗体,比如要复制Form2,则在Form2.cs上右单击,选择复制. 在 ...

  2. Sqlserver2005中的varchar,varchar,char,nchar的比较

    C#窗体中的TextBox 的MaxLength:与Nvarchar类似,不论是什么,最多只能为2.我我11我1

  3. 奶牛易物-Alpha版本测试报告

    1.在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个? a. 修复的bug: 1.mapper接口与mapper.xml文件绑定的问题; 2..配置逆向工程的配置文件的问题; 3.在编码 ...

  4. Apache Spark介绍及集群搭建

    简介 Spark是一个针对于大规模数据处理的统一分析引擎.其处理速度比MapReduce快很多.其特征有: 1.速度快 spark比mapreduce在内存中快100x,比mapreduce在磁盘中快 ...

  5. git服务器搭建问题

    CentOS6.5本地搭建. 对于图形化的系统,可以联网,然后CTRL+ALT+F2可以切换到命令行,CTRL+ALT+F1可以切换回桌面图形化. 可以用SSH和FTP来连接服务器和传文件.   (1 ...

  6. len=in.read(b,0,len)和len=in.read(b)的区别

    byte[] byte = new byte[1024]; int len =0 ; while((len=in.read(b))!=-1){ out.write(b,0,len); } read函数 ...

  7. linux shell脚本编程笔记(二): 分支结构

    1.if if command then commands fi if command then commands else commands fi if command1 then command ...

  8. 欢迎加入本人建的QQ群,讨论技术,生活及每天都有招聘信息

    银狐AS3游戏2 3438131 银狐AS3Help 1803321 银狐U3D 167024653 银狐AS3转H5 467565102 本人在MSDN上的帐号 https://social.msd ...

  9. linux系统中的命令替换与整数运算$(),$(())

    一.$()与`` 在 bash shell 中,$( ) 与 ` ` (反引号) 都是用来做命令替换(command substitution)用的. 所谓的命令替换与我们第五章学过的变量替换差不多, ...

  10. springboot之JdbcTemplate单数据源使用

    本文介绍在Spring Boot基础下配置数据源和通过JdbcTemplate编写数据访问的示例. 数据源配置 在我们访问数据库的时候,需要先配置一个数据源,下面分别介绍一下几种不同的数据库配置方式. ...