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> ... 
随机推荐
- 「APIO2016」烟花表演
			「APIO2016」烟花表演 解题思路 又是一道 solpe trick 题,观察出图像变化后不找一些性质还是挺难做的. 首先令 \(dp[u][i]\) 为节点 \(u\) 极其子树所有叶子到 \( ... 
- go 计算文件行
			package main import ( "bufio" "fmt" "os" ) func main() { //判断命令行参数,小于两 ... 
- [高清] 深入浅出Spring Boot 2.x.pdf + 代码
			------ 郑重声明 --------- 资源来自网络,纯粹共享交流, 如果喜欢,请您务必支持正版!! --------------------------------------------- 下 ... 
- python3-使用requests模拟登录网易云音乐
			# -*- coding: utf-8 -*- from Crypto.Cipher import AES import base64 import random import codecs impo ... 
- PHP利用preg_split函数格式化日期
			// 2018/2/13 00:26:00.000 function format_date($date, $format='Y-m-d H:i:s') { if(empty($date)) retu ... 
- SWD下载k60
			转:JTAG各类接口针脚定义,含义及SWD接线方式 IAR设置如下 
- django路由系统及分发路由的本质
			路由系统 当我们启动一个django项目后,想要通过浏览器访问到django项目中的资源 就需要在django中的urls项目中进行路由配置 urlpatterns = [ url(r'^admin/ ... 
- React Native 开发豆瓣评分(八)首页开发
			首页完成效果展示: 一.开发占位图组件 在没有数据的时候使用占位图替代 items 的位置. 在 components 目录里创建 moviesItemPlaceholder.js import Re ... 
- vue-resource 中 get / post / jsonp 三种请求方式的异同
			let url = 'http://www.phonegap100.com/appapi.php?a=getPortalList&catid=20&page=2';let params ... 
- sql基本常识[未完待续]
			---------------------------------------------------------------------------------------------------- ... 
