题目描述

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. diverta 2019 Programming Contest 2

    A:签到. #include<bits/stdc++.h> using namespace std; #define ll long long #define inf 1000000010 ...

  2. docker-compose 单机容器编排

    docker-compose用来在单机上编排容器(定义和运行多个容器,使容器能互通) docker-compose将所管理的容器分为3层结构:project  service  container d ...

  3. bat批处理删除多少天前的文件

    @echo off ::演示:删除指定路径下指定天数之前(以文件的最后修改日期为准)的文件. ::如果演示结果无误,把del前面的echo去掉,即可实现真正删除. ::本例需要Win2003/Vist ...

  4. asp.net core EF code first

    以连接mysql数据库为例 一 安装组件 Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Relational Microsof ...

  5. Manjaro 安装笔记

    双系统基本知识 [折腾日记]win10 ,ubuntu双系统安装避坑指南 Windows 下安装 Ubuntu 双系统(更新) rEFInd 总结注意点: 制作U盘启动盘一开始使用的是 Ulrstro ...

  6. 手写DAO框架(六)-框架使用示例

    一.引入pom <dependency> <groupId>me.lovegao</groupId> <artifactId>gdao</arti ...

  7. 使用PLSQL工具连接远程Oracle

    在不安装Oracle的情况下使用PLSQL连接远程的数据库步骤: 1)官网下载Instant client工具包 http://www.oracle.com/us/solutions/index-09 ...

  8. uc/xi

    一个较为通用的定义为:嵌入式系统是对对象进行自动控制而使其具有智能化并可嵌入对象体系统中的专用计算机系统. 实时性:目前,嵌入式系统广泛应用于生产过程控制.数据采集.传输通信等场合,这些应用的共同特点 ...

  9. linux学习记录--比较基本的文件档案知识

    [档案类型权限,连接数,档案拥有者,档案所属群组,档案容量,修改日期,档名],对应了上面的每一列的参数属性. 档案类型权限那一部分总共有十个字母,第一个字母代表档案类型: 当为[ d ]则是目录,例如 ...

  10. Python_模块的定义与使用

    1.模块的定义: 1.1 标准格式: import 模块名 模块名.函数名(实参列表) 1.2 特殊格式: from 模块名 import 函数名1,函数名2... 函数名(实参列表) 2.模块的使用 ...