【NOIP2014普及组复赛】题4:子矩阵

题3:子矩阵

【题目描述】

给出如下定义:

1.子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。

例如,下面左图中选取第 2 、 4 2、4 24行和第 2 、 4 、 5 2、4、5 245列交叉位置的元素得到一个 2 ∗ 3 2*3 23 的子矩阵如右图所示。
在这里插入图片描述

2.相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的。

3.矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和。

本题任务:给定一个 n n n m m m列的正整数矩阵,请你从这个矩阵中选出一个 r r r c c c列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值。

【输入】

第一行包含用空格隔开的四个整数 n , m , r , c n,m,r,c nmrc,意义如问题描述中所述,每两个整数之间用一个空格隔开。

接下来的 n n n行,每行包含 m m m个用空格隔开的整数,用来表示问题描述中那个 n n n m m m列的矩阵。

【输出】

输出共 1 1 1行,包含 1 1 1个整数,表示满足题目描述的子矩阵的最小分值。

【输入样例1】

5 5 2 3
9 3 3 3 9
9 4 8 7 4
1 7 4 6 6
6 8 5 6 9
7 4 5 6 1

【输出样例1】

6

【样例 1 说明】

该矩阵中分值最小的 2 2 2 3 3 3列的子矩阵由原矩阵的第 4 4 4行、第 5 5 5行与第 1 1 1列、第 3 3 3列、第 4 4 4列交叉位置的元素组成,为 675566 675566 675566
,其分值为 ∣ 6 − 5 ∣ + ∣ 5 − 6 ∣ + ∣ 7 − 5 ∣ + ∣ 5 − 6 ∣ + ∣ 6 − 7 ∣ + ∣ 5 − 5 ∣ + ∣ 6 − 6 ∣ = 6 |6-5|+|5-6|+|7-5|+|5-6|+|6-7|+|5-5|+|6-6|=6 ∣65∣+∣56∣+∣75∣+∣56∣+∣67∣+∣55∣+∣66∣=6

【输入样例2】

7 7 3 3
7 7 7 6 2 10 5
5 8 8 2 1 6 2
2 9 5 5 6 1 7
7 9 3 6 1 7 8
1 9 1 4 7 8 8
10 5 9 1 1 8 10
1 3 1 5 4 8 6

【输出样例2】

16

【样例 2 说明】

该矩阵中分值最小的 3 3 3 3 3 3列的子矩阵由原矩阵的第 4 4 4行、第 5 5 5行与第 2 2 2列、第 6 6 6列、第 7 7 7列交叉位置的元素组成,选取的分值最小子矩阵为 9957888810 9957888810 9957888810

【数据说明】

对于 50 % 50\% 50% 的数据, 1 ≤ n ≤ 12 , 1 ≤ m ≤ 12 1≤n≤12,1≤m≤12 1n12,1m12, 矩阵中的每个元素 1 ≤ a [ i ] [ j ] ≤ 20 1≤a[i][j]≤20 1a[i][j]20

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 16 , 1 ≤ m ≤ 16 1≤n≤16,1≤m≤16 1n16,1m16,矩阵中的每个元素 1 ≤ a [ i ] [ j ] ≤ 1000 , 1 ≤ r ≤ n , 1 ≤ c ≤ m 1≤a[i][j]≤1000,1≤r≤n,1≤c≤m 1a[i][j]1000,1rn,1cm

【代码如下】:

#include <bits/stdc++.h>
using namespace std;
ifstream cin("submatrix.in");
ofstream cout("submatrix.ans");
const int N=30;
int a[N][N];
int n,m,r,c;
int f[N][N];
int w[N][N];
bitset<20>now;//偷懒用了bitset做状压。。。 
int calc(int x)//计算横着的 第x行 
{int last=0x3f3f3f3f,ret=0;for(int i=0;i<m;i++)if(now[i]){if(last!=0x3f3f3f3f)ret+=abs(a[x][i+1]-last);last=a[x][i+1];}return ret;
}
int work(int x,int y)//x是这一行 y是上一行 
{if(y==0)return 0;int ret=0;for(int i=0;i<m;i++)if(now[i])ret+=abs(a[x][i+1]-a[y][i+1]);return ret;
}
void init()
{for(int i=1;i<=n;i++){int t1=calc(i);for(int j=i-1;j>=0;j--)w[i][j]=t1+work(i,j);}
}
void dp()
{int ans=0x3f3f3f3f;for(int s=0;s<(1<<m);s++){    now=s;if(now.count()!=c)continue;memset(f,0x3f,sizeof f);f[0][0]=0;init();for(int i=1;i<=n;i++){for(int j=1;j<=r;j++){for(int k=0;k<i;k++)f[i][j]=min(f[k][j-1]+w[i][k],f[i][j]);}ans=min(ans,f[i][r]);}}cout << ans << endl;
}
int main()
{cin >> n >> m >> r >> c;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin >> a[i][j];dp();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15858.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue项目中使用json编辑器

实现效果&#xff1a; 借助插件json-editor-vue3实现效果如图一&#xff0c;如果嫌丑可以通过类名改一下样式如图二。 实现过程&#xff1a; 安装插件&#xff1a;npm install json-editor-vue3 文档链接&#xff1a;GitCode - 开发者的代码家园 <script setup name&quo…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

Vite + Vue3 部署 GitHub

因为静态资源是可以部署到 GitHub 上&#xff0c;自己顺便学习部署网站 因为我使用的是 Vite 工具&#xff0c;官方有提供相应 Demo 部署静态站点 | Vite 官方中文文档 新建文件夹 .github 然后再建一个文件夹 workflows 新建文件 main.yml 文件 直接使用官方文档 demo #…

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…

Java-MySql:JDBC

目录 JDBC概述 JDBC搭建 1、导入mysql开发商提供的jar包 2、注册驱动 3、与数据库连接 注解&#xff1a; Statement&#xff1a; 代码 运行 PreparedStatement&#xff1a; 代码 运行 PreparedStatement和Statement Statement 增 代码 运行 删 代码 运…

九、图形化脚本

多年来&#xff0c; shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时&#xff0c;就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

AI遇上遥感,未来会怎样?

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…

【vue】el-select选择器实现宽度自适应

选择器的宽度根据内容长度进行变化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知识-可变参数、Collections工具类

目录 可变参数 Collections工具类 Collections的常用静态方法 实例演示 可变参数 可变参数 就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型...参数名称 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&am…

SQL常用基础语句(一)-- ABCDE开头

AS 将列名从 count(*) 修改为 total select count(*) as total from users where status0 将列名 username 改为 uname&#xff0c; password 改为 upwd select username as uname, password as upwd from users BETWEEN AND 说明&#xff1a;BETWEEN 筛选的是 >value1且 &l…

小程序主体变更是通过迁移吗?是需要2个小程序吗?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…

操作系统实验四:多线程与信号量编程

操作系统实验上机 更多技术请访问&#xff1a;www.xuanworld.top 部分审核不通过的文章将发至个人博客&#xff1a;www.xuanworld.top 欢迎来52破解论坛阅读帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 实验名称实验序号实验日期实验人多线程与信号量…

010-Linux磁盘介绍

文章目录 1、名词 2、类型 3、尺寸 4、接口/协议/总线 5、命名 6、分区方式 MBR分区 GPT分区 1、名词 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy D…

基于yolov5和desnet的猫咪识别模型

前言 前段时间给学校的猫咪小程序搭建了识猫模型&#xff0c;可以通过猫咪的照片辨别出是那只猫猫&#xff0c;这里分享下具体的方案&#xff0c;先看效果图&#xff1a; 源代码在文末 模型训练 在训练服务器&#xff08;或你的个人PC&#xff09;上拉取本仓库代码。 图片数…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器&#xff0c;可以快速将文本内容转换成极具吸引力的视频。操作简单&#xff0c;用户只需输入文字&#xff0c;选择喜欢的样式和模板&#xff0c; “巨日禄”就会…

Day39贪心算法part06

LC738单调递增的数字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想让strNum[i - 1]–&#xff0c;然后strNum[i]给为9字符串是不可变的&#xff0c;不可以使用s.char…

树莓派学习笔记——树莓派的三种GPIO编码方式

1、板载编码&#xff08;Board pin numbering&#xff09;: 板载编码是树莓派上的一种GPIO引脚编号方式&#xff0c;它指的是按照引脚在树莓派主板上的物理位置来编号。这种方式对于初学者来说可能比较直观&#xff0c;因为它允许你直接根据引脚在板上的位置来编程。 2、BCM编…

Linux gurb2简介

文章目录 前言一、GRUB 2简介二、GRUB 2相关文件/文件夹2.1 /etc/default/grub文件2.2 /etc/grub.d/文件夹2.3 /boot/grub/grub.cfg文件 三、grubx64.efi参考资料 前言 简单来说&#xff0c;引导加载程序&#xff08;boot loader&#xff09;是计算机启动时运行的第一个软件程…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《计及温控厌氧发酵和阶梯碳交易的农村综合能源低碳经济调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…