P2258 子矩阵

题目描述

给出如下定义:

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

例如,下面左图中选取第 222 、 444 行和第 222 、 444 、 555 列交叉位置的元素得到一个 2×32 \times 32×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

的其中一个 2×32 \times 32×3 的子矩阵是

4 7 4

8 6 9

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

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

本题任务:给定一个 nnn 行 mmm 列的正整数矩阵,请你从这个矩阵中选出一个 rrr 行 ccc 列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值。

(本题目为2014NOIP普及## 题目描述

给出如下定义:

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

例如,下面左图中选取第 222 、 444 行和第 222 、 444 、 555 列交叉位置的元素得到一个 2×32 \times 32×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

的其中一个 2×32 \times 32×3 的子矩阵是

4 7 4

8 6 9

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

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

本题任务:给定一个 nnn 行 mmm 列的正整数矩阵,请你从这个矩阵中选出一个 rrr 行 ccc 列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值。

(本题目为2014NOIP普及T4)

输入输出格式

输入格式:

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

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

输出格式:

一个整数,表示满足题目描述的子矩阵的最小分值。

输入输出样例

输入样例#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

输入样例#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

说明

【输入输出样例1说明】

该矩阵中分值最小的 222 行 333 列的子矩阵由原矩阵的第 444 行、第 555 行与第 111 列、第 333 列、第 444 列交叉位置的元素组成,为

6 5 6

7 5 6

,其分值为:

|6−5| + |5−6| + |7−5| + |5−6| + |6−7| + |5−5| + |6−6| =6。

【输入输出样例2说明】

该矩阵中分值最小的3行3列的子矩阵由原矩阵的第 444 行、第 555 行、第 666 行与第 222 列、第 666 列、第 777 列交叉位置的元素组成,选取的分值最小的子矩阵为

9 7 8
9 8 8
5 8 10

【数据说明】

对于 50%50%50% 的数据, 1≤n≤12,1≤m≤121 ≤ n ≤ 12,1 ≤ m ≤ 121≤n≤12,1≤m≤12 ,矩阵中的每个元素 1≤aij≤201 ≤ a_{ij} ≤ 201≤aij​≤20 ;

对于 100%100%100% 的数据, 1≤n≤16,1≤m≤161 ≤ n ≤ 16,1 ≤ m ≤ 161≤n≤16,1≤m≤16 ,矩阵中的每个元素 1≤aij≤1,000,1≤r≤n,1≤c≤m1 ≤ a_{ij} ≤ 1,000,1 ≤ r ≤ n,1 ≤ c ≤ m1≤aij​≤1,000,1≤r≤n,1≤c≤m 。T4)

输入输出格式

输入格式:

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

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

输出格式:

一个整数,表示满足题目描述的子矩阵的最小分值。

输入输出样例

输入样例#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

输入样例#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

说明

【输入输出样例1说明】

该矩阵中分值最小的 222 行 333 列的子矩阵由原矩阵的第 444 行、第 555 行与第 111 列、第 333 列、第 444 列交叉位置的元素组成,为

6 5 6

7 5 6

,其分值为:

|6−5| + |5−6| + |7−5| + |5−6| + |6−7| + |5−5| + |6−6| =6。

【输入输出样例2说明】

该矩阵中分值最小的3行3列的子矩阵由原矩阵的第 444 行、第 555 行、第 666 行与第 222 列、第 666 列、第 777 列交叉位置的元素组成,选取的分值最小的子矩阵为

9 7 8
9 8 8
5 8 10

【数据说明】

对于 \(50\%\)的数据, \(1 ≤ n ≤ 12,1 ≤ m ≤ 12\),矩阵中的每个元素 \(1 ≤ a_{ij} ≤ 20\)

对于 \(100\%\) 的数据, \(1≤n≤16,1≤m≤16\) ,矩阵中的每个元素 \(1 ≤ a_{ij} ≤ 1,000,1 ≤ r ≤ n,1 ≤ c ≤ m\)


先爆搜出\(r\)行,再在选出的行中dp选出\(c\)列即可

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;int i,m,n,j,k,a[20][20],b[20][20],r,c,d[20],w[20],f[20][20],ans=0x3f3f3f3f;void dp()
{memset(w,0,sizeof(w));memset(b,0,sizeof(b));memset(f,0x3f,sizeof(f));for(int i=1;i<=m;i++)for(int j=2;j<=r;j++) w[i]+=abs(a[d[j]][i]-a[d[j-1]][i]);for(int i=1;i<m;i++)for(int j=i+1;j<=m;j++) for(int l=1;l<=r;l++)b[i][j]+=abs(a[d[l]][i]-a[d[l]][j]);f[0][0]=0;for(int i=1;i<=m;i++)for(int j=1;j<=min(i,c);j++)for(int l=j-1;l<i;l++)f[i][j]=min(f[i][j],f[l][j-1]+b[l][i]+w[i]);for(int i=c;i<=m;i++) ans=min(ans,f[i][c]);
}void dfs(int k,int now)
{if(k==r) {dp(); return;}for(int i=now;i<=n-r+k+1;i++) d[k+1]=i,dfs(k+1,i+1);
}int main()
{scanf("%d%d%d%d",&n,&m,&r,&c);for(i=1;i<=n;i++)for(j=1;j<=m;j++) scanf("%d",&a[i][j]);dfs(0,1);printf("%d",ans);
}

转载于:https://www.cnblogs.com/ZUTTER/p/9509605.html

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

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

相关文章

Windows 系统安装Docker Compose 步骤

参考 Docker Compose official 官方安装指南: https://docs.docker.com/compose/install/ 实际上到目前为止还不能直接在Windows上安装Docker Compose&#xff0c;所以这篇文章要讲的是如何在Windows上使用Docker Compose。 先决条件: Docker Machine 已经安装完毕。 解决方案:…

vagrant box各种命令汇总

最近在研究laravel&#xff0c;中间用到了vagrant 虚拟机管理工具&#xff0c;学习一下他的命令 vagrant box命令 用于管理boxes的命令&#xff0c;比如添加、删除等等。 此命令的功能主要通过以下子命令完成&#xff1a; add list outdated prune remove repackage update Box…

运行第一个 docker image 并在浏览器中查看

1. SSH to Docker 虚拟机. 打开gitBash或者Docker Quickstart Terminal, 并且输入: <span style"font-size:14px;">$ docker-machine ssh <docker machine name></span>如需要更详细的如何连接Docker Machine的介绍&#xff0c;可以参考我的另一篇…

js_!和!!的使用

js中有些特殊的数据&#xff08;“” 0 null undefined NaN&#xff09;,请求后台返回的数据中往往都有一些这样的数据&#xff0c;需要对这些数据进行过滤。 过滤代码 var a 0;//0 "" null undefined NaN //如果有内容不为&#xff08;0 "" null undefi…

Fixed Function Shader

Fixed function shader(固定管线着色器) Shader "Custom/Text01" { //shader名称 Properties   Shader属性 { //定义一个名称为Main Color属性 _Color ("Main Color", Color) (1,0.5,0.5,1) _SpecularColor("高光颜色"…

linux 时间同步ntp

配置前准备:关闭防火墙,配置好hosts,ssh免密登录 1.选定同步的标准,我是以hadoop002(设置为当前时间)作为同步标准,hadoop003(时间是2018年3月21,使用date -s进行设置)与hadoop004(2018年3月21)与之保持同步 在hadoop002上查看是否安装ntp rpm -qa|grep ntp,如果没有显示内容说…

Hadoop集群(一) Zookeeper搭建

作为Hadoop初学者&#xff0c;自然要从安装入手。而hadoop的优势就是分布式&#xff0c;所以&#xff0c;也一定要安装分布式的系统。 整体安装步骤&#xff0c;包括ZookeeperHDFSHbase&#xff0c;为了文章简洁&#xff0c;我会分三篇blog记录我的安装步骤。 本文记录的是集群…

四六级成绩查询,你的『验证码』刷出来了吗?

沉浸在暑假余温里的小可爱们&#xff0c;今天被四六级成绩查询的验证码无情的伤害了一次。 就在8月22日&#xff0c;也就是今天上午9点&#xff0c;学霸们泰然自若&#xff0c;学渣们瑟瑟发抖&#xff0c;有的人甚至在心里考虑是否发微博、朋友圈谢谢超越姐姐&#xff08;此时输…

IOS自动化打包平台

http://note.youdao.com/noteshare?iddf404ef54eaf2b5104478e05427550d5转载于:https://www.cnblogs.com/songhaozhi080616/p/9524758.html

课时40:类与对象:一些相关的BIF

目录&#xff1a; 一、一些相关的BIF 二、、课时40课后习题及答案 ********************** 一、一些相关的BIF ********************** 1、issubclass&#xff08;class,classinfo&#xff09; 如果第一个参数&#xff08;class&#xff09;是第二个参数&#xff08;classinfo…

Visual Studio Code搭建NodeJs的开发环境

一、Visual Studio Code搭建NodeJs的开发环境 1.下载安装NodeJs并配置环境变量 可以参考&#xff1a;NodeJs的安装和环境变量配置 2.下载安装 VS Code编辑器 可以参考&#xff1a;VsCode插件整理 3.使用Typings工具配置VS Code 的智能提示 可以参考&#xff1a; VS Code智能提示…

HashMap和Hashtable 线程安全性

HashMap和Hashtable的比较是Java面试中的常见问题&#xff0c;用来考验程序员是否能够正确使用集合类以及是否可以随机应变使用多种思路解决问题。HashMap的工作原理、ArrayList与Vector的比较以及这个问题是有关Java 集合框架的最经典的问题。Hashtable是个过时的集合类&#…

Luogu P1280 Niko的任务【线性dp】By cellur925

Nikonikoni~~ 题目传送门 这是当时学长讲dp的第一道例题&#xff0c;我还上去献了个丑&#xff0c;然鹅学长讲的方法我似董非董(??? 我当时说的怎么设计这道题的状态&#xff0c;但是好像说的是二维&#xff0c;本题数据范围均在10000级别&#xff0c;n肯定会空间炸掉的&…

这项技术竟然一个字也不放过!

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 本文由腾讯云AI中心发表于云社区专栏 摘要&#xff1a;在日常生活工作中&#xff0c;我们难免会遇到一些问题&#xff0c;比如自己辛辛苦苦写完的资料&#xff0c;好不容易打印出来却发现源文件丢了;收集了…

AltiumDesigner17快捷键

画线CtrlW转载于:https://www.cnblogs.com/scrazy/p/9533996.html

Capistrano deploy flow outline

Official flow reference: 点击打开链接 An example flow: Deploy: starting Rbenv ensures that the version we configured on config/deploy.rb is installed and that it can write on disc. Checks git repository Create needed folder tree /var/www App_name Shared Pu…

nginx应用geoip模块,实现不同地区访问不同页面的需求(实践版)

https://www.52os.net/articles/configure-nginx-using-geoip-allow-whitelist.html 搞了几天没有搞定&#xff0c;这篇文章一下子解决了问题&#xff0c;点赞 记得nginx编译时一定要加载geoip这个模块 https://blog.csdn.net/beyond__devil/article/details/52838422 …

GoCD notes

Every task in a job is run as an independent program.Changes made by a task to any of its environment variables will not affect subsequent tasks.Changes made by a task on the file system will be visible to subsequent tasks.

给网页标题添加icon小图标

so easy: 给网页标题添加icon小图标: 直接在html文件的head部分添加下面代码&#xff08;注意href的路径&#xff09;&#xff1a; <link rel"icon" type"image/x-icon" href"../static/images/brand.jpg" />转载于:https://www.cnblogs.c…

百练2815:城堡问题(DFS)

描述 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | # # # # # #---#####---#####---#####---# 3 # | | # # # # # #---#########---#####---#---#…