题解 矩阵 matrix
矩阵 matrix
Description
给出一个 n × m 的矩阵。请在其中选择至多 3 个互不相交的,大小恰为 k × k 的子矩阵,使得子矩阵的 权值和最大。
Input
第一行三个整数 n, m, k ( n, m ≤ 1500) 。
接下来 m 行,每行 n 个整数,描述矩阵。矩阵中的每个元素值都为非负整数,且不超过 500 。
Output
输出一行一个整数,描述答案。
Sample Input
9 9 3
1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 8 8 8 8 8 1 1 1
1 1 1 1 8 8 8 1 1
1 1 1 1 1 1 8 8 8
1 1 1 1 1 1 9 9 9
1 1 1 1 1 1 9 9 9
Sample Output
208
解析
这道题似乎并不好写...
因为要使矩阵互不相交...
等等,
如果矩阵互不相交,那么肯定存在两条线,能把三个矩阵分开.
那么,就有六种情况(具体情况自己画一下吧毕竟我画的图丑陋到自己都看不下去),
于是我们可以用\(mp[i][j]\)表示以(\(i\),\(j\))为右下角的矩阵的和,
并用\(a[i][j]\),\(b[i][j]\),\(c[i][j]\),\(d[i][j]\),分别表示点(\(i\),\(j\))左上,右上,左下,右下区域中取一个\(k\)*\(k\)矩阵的最大值,
所以,只需要对于六种情况,分别枚举两条线,并更新答案就行了.
代码可能有点非常丑陋:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int sum=0,f=1;char ch=getchar();
	while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0' && ch<='9'){sum=sum*10+ch-'0';ch=getchar();}
	return f*sum;
}
int n,m,k,ans=0;
int a[1501][1501],c[1501][1501];
int b[1501][1501],d[1501][1501];
int s[1501][1501],mp[1501][1501];
int main(){
	n=read();m=read();k=read();
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++) a[i][j]=read();
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++) s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
	for(int i=k;i<=m;i++)
		for(int j=k;j<=n;j++) mp[i][j]=s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k];
	memset(a,0,sizeof(a));
	for(int i=k;i<=m;i++)
		for(int j=k;j<=n;j++) a[i][j]=max(mp[i][j],max(a[i-1][j],a[i][j-1]));
	for(int i=k;i<=m;i++)
		for(int j=k;j<=n;j++) b[i][j]=max(mp[i][j],max(b[i-1][j],b[i][j+1]));
	for(int i=k;i<=m;i++)
		for(int j=k;j<=n;j++) c[i][j]=max(mp[i][j],max(c[i+1][j],c[i][j-1]));
	for(int i=k;i<=m;i++)
		for(int j=k;j<=n;j++) d[i][j]=max(mp[i][j],max(d[i+1][j],d[i][j+1]));
	for(int i=k;i<=m-k;i++)
		for(int j=k;j<=n-k;j++) ans=max(ans,a[i][n]+c[i+k][j]+d[i+k][j+k]);
	for(int i=k;i<=m-k;i++)
		for(int j=k;j<=n-k;j++) ans=max(ans,c[i+k][n]+a[i][j]+b[i][j+k]);
	for(int i=k;i<=m-k;i++)
		for(int j=k;j<=n-k;j++) ans=max(ans,a[m][j]+b[i][j+k]+d[i+k][j+k]);
	for(int i=k;i<=m-k;i++)
		for(int j=k;j<=n-k;j++) ans=max(ans,b[m][j+k]+a[i][j]+c[i+k][j]);
	for(int i=k;i<=m-k;i++)
		for(int j=k+k;j<=n-k;j++) ans=max(ans,a[m][j-k]+mp[i][j]+b[m][j+k]);
	for(int i=k+k;i<=m-k;i++)
		for(int j=k;j<=n-k;j++) ans=max(ans,a[i-k][n]+mp[i][j]+c[i+k][n]);
	printf("%d\n",ans);
	return 0;
}
												
											题解 矩阵 matrix的更多相关文章
- numpy教程:矩阵matrix及其运算
		
http://blog.csdn.net/pipisorry/article/details/48791403 numpy矩阵简介 NumPy函数库中存在两种不同的数据类型(矩阵matrix和数组ar ...
 - 果皇的矩阵[matrix]
		
#1101. 果皇的矩阵[matrix] 题目描述 输入格式 一行两个数,表示 N,M. 输出格式 一行一个数,表示答案对 10^9+7 取模后的结果 样例 样例输入 3 3 样例输出 38 数据范围 ...
 - python小白之矩阵matrix笔记(updating)
		
Matrix #python学习之矩阵matrix 2018.4.18 # -*- coding: UTF-8 -*- from numpy import * import numpy as np i ...
 - 矩阵matrix
		
矩阵matrix 1. 矩阵matrix 1.1. 定义由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵.记作: 这m×n 个数称为矩阵A的元素,简称为元,数aij ...
 - C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速
		
Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...
 - [LeetCode 题解] Spiral Matrix
		
前言 [LeetCode 题解]系列传送门: http://www.cnblogs.com/double-win/category/573499.html 题目链接 54. Spiral Matrix ...
 - 变形--矩阵 matrix()
		
matrix() 是一个含六个值的(a,b,c,d,e,f)变换矩阵,用来指定一个2D变换,相当于直接应用一个[a b c d e f]变换矩阵.就是基于水平方向(X轴)和垂直方向(Y轴)重新定位元素 ...
 - 矩阵 matrix
		
传送门 注意这题时限是2s [问题描述] 有一个n × m的矩阵,你从左上角走到右下角,只能向下和向右走. 每个点上有一个重量v i,j 价值w i,j 的物品,你有一个容量为S的背包,经过一个点你可 ...
 - R语言矩阵matrix函数
		
矩阵是元素布置成二维矩形布局的R对象. 它们包含相同原子类型的元素.尽管我们可以创建只包含字符或只逻辑值的矩阵,但是它们没有多大用处.我们使用的是在数学计算中含有数字元素矩阵. 使用 matrix() ...
 
随机推荐
- 【Python】【基础知识】【内置常量】
			
Python的内置常量有: False.True.None.NotImplemented.Ellipsis.__debug__ 由 site 模块添加的常量:quit.exit.copyright.c ...
 - Hive_解析 get_json_object ( )
			
Hive_解析 get_json_object ( ) get_json_object ( string json_string, string path ) 说明: 第一个参数填写json对象 ...
 - Typora的使用-规整笔记 让我以后的笔记内容更加整齐
			
以后我用typora写笔记使用这种排版方式, 且可以方便的看到大纲. 大标题二级标题 内容分类 三级标题 内容讲解 四级标题 内容分块 五级标题
 - tr、od命令
			
一.tr:替换或删除字符 语法: tr [OPTION] ... SET1 [SET2] 描述 翻译,压缩和/或删除标准输入中的字符,可写吗? 到标准输出. -c, ...
 - 使用python的ctypes库实现内存的动态申请和释放
			
1.申请前内存占用情况 2.申请内存 from ctypes import * import time #在这里申请1G的内存,单位k mem = create_string_buffer(1024* ...
 - jenkins+docker+git+etcd实现应用配置文件管理
			
两台机器: 一台机器安装gitlab: http://www.cnblogs.com/cjsblogs/p/8716932.html 另一台机器安装etcd+docker+jenkins jenkin ...
 - 链表分割——牛客剑指offer
			
题目描述: 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 给定一个链表的头指针 ListNode pHead,请返回重新排列后的链表的头指针.注意:分割以后 ...
 - linux 下安装 jre
			
本文链接:https://blog.csdn.net/qq_34368587/article/details/79559102 Linux下安装Java运行环境 现需要项目部署到Linux中,需要配置 ...
 - C++入门基础知识(一)
			
一:关键字 在C语言中,我们已经学习过了很多的关键字,例如:static,struct等,下面展现一下C++中的一些关键字. 二:命名空间 在C/C++中,变量.函数和类都是大量存在的,这些变量.函数 ...
 - 清除SQL日志文件
			
1.清除errorlog文件 MSSQL在 C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\LOG 目录下存放这一些日志文件,一共是7个,常常会 ...