题目描述

LYK进了一家古董店,它很想买其中的一幅画。但它带的钱不够买这幅画。

幸运的是,老板正在研究一个问题,他表示如果LYK能帮他解出这个问题的话,就把这幅画送给它。

老板有一个n*m的矩阵,他想找一个和最大的子矩阵,这个子矩阵可以由四个参数x,y,x2,y2(1<=x<=x2<=n,1<=y<=y2<=m)来表示,表示一个左上角为(x,y),右下角为(x2,y2)的矩阵。

为了让游戏更加有趣,老板给了一个常数P,他想将原来这个矩阵中恰好一个数变为P,使得这个矩阵的最大的子矩阵尽可能大。

老板想知道这个最大值是多少。

你能帮帮LYK吗?

输入输出格式

输入格式:

第一行三个数n,m,P。

接下来n行,每行m个数ai,j描述整个矩阵。

输出格式:

输出一个数表示答案。

输入输出样例

输入样例#1:

3 3 3
-100 3 3
3 -4 3
3 3 3
输出样例#1:

20

样例解释
改变左上角那个数。

说明

对于20%的数据n,m<=10。

对于40%的数据n,m<=25。

对于60%的数据n,m<=50。

对于80%的数据n,m<=100。

对于100%的数据1<=n,m<=300,|P|,|ai,j|<=1000。

40分暴力:

 /*预处理出二维前缀和,枚举每个矩阵,当前矩阵的元素和tot可以用预处理出来的前缀和算出来,然后找每个矩阵中的最小值minn,如果这个最小值minn小于p,那么就将它改为p,tot=tot-minn+p,否则不改。 Ans=max(ans,tot)
时间复杂度O(n^3*m^3)*/
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#define N 65
using namespace std; int n,m,p,ans=-,minn,zuixiao[N][N][N][N];
int sum[N][N],num[N][N],tot; inline void read(int &num)
{
int f=;
char c=getchar();
for(;!isdigit(c);c=getchar()){if(c=='-') f=-;};
for(;isdigit(c);c=getchar()){num=num*+c-'';};
num*=f;
} inline int _max(int a,int b)
{
return a>b?a:b;
} inline int _min(int a,int b)
{
return a<b?a:b;
} int main()
{
freopen("puzzle.in","r",stdin);
freopen("puzzle.out","w",stdout);
read(n),read(m),read(p);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
read(num[i][j]);
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
sum[i][j]=sum[i-][j]+sum[i][j-]-sum[i-][j-]+num[i][j];
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
for(int k=i;k<=n;k++)
{
for(int l=j;l<=m;l++)
{
tot=sum[k][l]-sum[i-][l]-sum[k][j-]+sum[i-][j-];
minn=;
for(int a=i;a<=k;a++)
{
for(int b=j;b<=l;b++)
{
minn=_min(minn,num[a][b]);
}
}
if(minn<p) tot=tot-minn+p;
ans=_max(ans,tot);
}
}
}
}
printf("%d",ans);
fclose(stdin);
fclose(stdout);
return ;
}

正解:

 /*
n^2前缀和+n^2预处理矩阵最小值+n^3求解
复杂度 O(n^3)
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 305
#define INF -999999999
using namespace std; int n,m,ans,p;
int a[N][N],b[N],minn[N],dp[N][],sum[N][N]; int main()
{
scanf("%d",&n);
ans=INF;
scanf("%d%d",&m,&p);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
sum[i][j]=sum[i-][j]+a[i][j];
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++) minn[j]=a[i][j];
for(int j=i;j<=n;j++)
{
for(int k=;k<=m;k++) minn[k]=min(minn[k],a[j][k]);
for(int k=;k<=m;k++) b[k]=sum[j][k]-sum[i-][k];
dp[][]=INF;
for(int k=;k<=m;k++)
{
dp[k][]=max(dp[k-][]+b[k],b[k]);
dp[k][]=max(max(dp[k-][]+b[k],dp[k-][]+b[k]-minn[k]+p),b[k]-minn[k]+p);
}
for(int k=;k<m;k++) ans=max(ans,max(dp[k][],dp[k][]));
if(i==&&j==n)
{
ans=max(ans,dp[m][]);
int sum=;
for(int k=m;k>;k--)
{
sum+=b[k];
ans=max(ans,sum);
}
}
else ans=max(ans,max(dp[m][],dp[m][]));
}
}
printf("%d\n",ans);
return ;
}

2017.10.3 国庆清北 D3T3 解迷游戏的更多相关文章

  1. 2017.10.1 国庆清北 D1T1 zhx的字符串题

    题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...

  2. 2017.10.4 国庆清北 D4T2 正方形

    题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...

  3. 2017.10.6 国庆清北 D6T2 同余方程组

    题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...

  4. 2017.10.6 国庆清北 D6T1 排序

    题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. 比如a 序列 ...

  5. 2017.10.3 国庆清北 D3T2 公交车

    题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...

  6. 2017.10.3 国庆清北 D3T1 括号序列

    题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的括号序列. 若A是合法的括号序列,则(A)是合法的括号序列. 若A和B分别是合法的括号序列,则AB是合法的 ...

  7. 2017.10.4 国庆清北 D4T1 财富

    (其实这题是luogu P1901 发射站 原题,而且数据范围还比luogu小) 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在 ...

  8. 2017.10.7 国庆清北 D7T1 计数

    题目描述 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. 输入输出格式 输入格式: 输入文件名为count.in. 第一行,包含两个整数:n ...

  9. 2017.10.5 国庆清北 D5T2 整除

    80分暴力 /*找规律80分TLE俩点 忘了啥规律了. */ #include<iostream> #include<cstdio> #include<cmath> ...

随机推荐

  1. quartz2.3.0(五)制定错过执行任务的misfire策略,用pause,resume模拟job暂停执行和继续执行

    感谢兄台: <quartz-misfire 错失.补偿执行> misfire定义 misfire:被错过的执行任务策略 misfire重现——CronTrigger job任务类: pac ...

  2. AQS(AbstractQueuedSynchronizer)

    AbstractQueuedSynchronizer 是一个锁框架.实现的原理(大概): 1.关于重入锁方面的实现,参考(手写一个可重入锁). 2.关于公平锁方面的实现,使用双链表的形式,进行公平锁的 ...

  3. Lucene BooleanQuery中的Occur.MUST与Occur.Should

    https://www.cnblogs.com/weipeng/archive/2012/04/18/2455079.html   1.  多个MUST的组合不必多说,就是交集 2.  MUST和SH ...

  4. Git命令和使用

    Git & GitHub Git是一个工具,用于命令行操作 GitHub是一个协同工作平台 包括: Remote original Repository - 远程主仓库(上线唯一仓库) Rem ...

  5. ASP.NET面试题130道

     130道ASP.NET面试题 1. 简述 private. protected. public. internal 修饰符的访问权限. 答 . private : 私有成员, 在类的内部才可以访问. ...

  6. docker 入坑3

    查看镜像 docker images [OPTIONS] [REPOSITORY[:TAG]] -a, --all=false -f, --filter=[] --no-trunc=false -q, ...

  7. (二) Windows 进行 Docker CE 安装(Docker Desktop)

    参考并感谢 官方文档: https://docs.docker.com/docker-for-windows/install/ 下载地址 https://download.docker.com/win ...

  8. OO——JML作业总结

    目录 第三单元博客作业 JML语言理论基础 1.注释结构 2.JML表达式 3.方法规格 4.类型规格 应用工具链 JMLUnitNG使用实例 作业架构设计 第一次作业 第二次作业 第三次作业 BUG ...

  9. Awesome Mac OS Command Line 中文翻译

    awesome-macos-command-line 收集了很多有趣的 Mac 终端命令. 看了一遍后,发现帮助很大. 见识许多没有使用过的命令,加深了对 Mac 的认识. 所以翻译成了中文,共享给其 ...

  10. h3c 802.11协议的发展进程