2017.10.3 国庆清北 D3T3 解迷游戏
题目描述
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描述整个矩阵。
输出格式:
输出一个数表示答案。
输入输出样例
3 3 3
-100 3 3
3 -4 3
3 3 3
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 解迷游戏的更多相关文章
- 2017.10.1 国庆清北 D1T1 zhx的字符串题
题目背景 2017国庆清北D1T1 题目描述 你是能看到第一题的 friends 呢. ——hja 何大爷对字符串十分有研究,于是天天出字符串题虐杀 zhx.何大爷今天为 字符串定义了新的权值计算方法 ...
- 2017.10.4 国庆清北 D4T2 正方形
题目描述 在一个10000*10000的二维平面上,有n颗糖果. LYK喜欢吃糖果!并且它给自己立了规定,一定要吃其中的至少C颗糖果! 事与愿违,LYK只被允许圈出一个正方形,它只能吃在正方形里面的糖 ...
- 2017.10.6 国庆清北 D6T2 同余方程组
题目描述 求关于x 的同余方程组 x%a1 = b1 x%a2 = b2 x%a3 = b3 x%a4 = b4 的大于等于0 的最小整数解. 输入输出格式 输入格式: 一行8 个整数,表示a1; b ...
- 2017.10.6 国庆清北 D6T1 排序
题目描述 小Z 有一个数字序列a1; a2; .... ; an,长度为n,小Z 只有一个操作:选 定p(1<p<n),然后把ap 从序列中拿出,然后再插⼊到序列中任意位置. 比如a 序列 ...
- 2017.10.3 国庆清北 D3T2 公交车
题目描述 LYK在玩一个游戏. 有k群小怪兽想乘坐公交车.第i群小怪兽想从xi出发乘坐公交车到yi.但公交车的容量只有M,而且这辆公交车只会从1号点行驶到n号点. LYK想让小怪兽们尽可能的到达自己想 ...
- 2017.10.3 国庆清北 D3T1 括号序列
题目描述 LYK有一个括号序列,但这个序列不一定合法. 一个合法的括号序列如下: ()是合法的括号序列. 若A是合法的括号序列,则(A)是合法的括号序列. 若A和B分别是合法的括号序列,则AB是合法的 ...
- 2017.10.4 国庆清北 D4T1 财富
(其实这题是luogu P1901 发射站 原题,而且数据范围还比luogu小) 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以身高为美的环境,因此在 ...
- 2017.10.7 国庆清北 D7T1 计数
题目描述 给出m个数a[1],a[2],…,a[m] 求1~n中有多少数不是a[1],a[2],…,a[m]的倍数. 输入输出格式 输入格式: 输入文件名为count.in. 第一行,包含两个整数:n ...
- 2017.10.5 国庆清北 D5T2 整除
80分暴力 /*找规律80分TLE俩点 忘了啥规律了. */ #include<iostream> #include<cstdio> #include<cmath> ...
随机推荐
- (一)Django项目的目录结构
1.将app放在apps文件夹中,将改文件夹设置为 source root,便于引用.两个app不可以互相引用,可以利用第三个app实现一些操作. 2.将一些多媒体文件放在media中的相应app名称 ...
- js 简单的滑动3
js 简单的滑动教程(三) 作者:Lellansin 转载请标明出处,谢谢 在前面的基础上(js 简单的滑动教程(二)),我们可以再添加一些功能使程序的可用性更高. 比如自动为图片的LI赋id值, ...
- ABAP开发环境终于支持以驼峰命名法自动格式化ABAP变量名了
Jerry进入SAP成都研究院前,一直是用C/C++开发,所以刚接触ABAP,对于她在某些语法环境下大小写敏感,某些环境下不敏感的特性很不适应.那时候Jerry深深地怀念之前在C/C++编程时遵循的驼 ...
- GC是如何判断一个对象为"垃圾"的?被GC判断为"垃圾"的对象一定会被回收吗?
一.GC如何判断一个对象为”垃圾”的java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”.那么GC具体通过什么手段来 ...
- springboot学习入门简易版六---springboot2.0整合全局捕获异常及log4j日志(12-13)
使用Aop实现 1创建异常请求 在原有项目基础上,jspController中创建一个可能发生异常的请求: /** * 全局捕获异常测试 * @param i * @return */ @Reques ...
- 13.5. zipfile — Work with ZIP archives
13.5. zipfile — Work with ZIP archives Source code: Lib/zipfile.py The ZIP file format is a common a ...
- 资源管理与调度系统-YARN的资源调度器
资源管理与调度系统-YARN的资源调度器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 资源调度器是Hadoop YARN中最核心的组件之一,它是ResourceManager中的 ...
- ICS2019汇编实验在Linux下使用GDB调试程序
- SQL进阶系列之1CASE表达式
配置环境: 下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads#windows 使用数据库: C:\Po ...
- 剑指Offer(二十三):二叉搜索树的后序遍历序列
剑指Offer(二十三):二叉搜索树的后序遍历序列 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...