当前位置: 首页 > news >正文

C++题解:[NOIP2014]子矩阵

目录

题目

题解


题目

给出如下定义:

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

    例如,下面左图中选取第 2 、 4 行和第 2 、 4 、 5 列交叉位置的元素得到一个 2×3 的子矩阵如右图所示。

  1. 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的。
  1. 矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和。

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

输入格式

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

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

输出格式

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

数据范围

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

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

样例说明

样例1:

该矩阵中分值最小的 22 行 33 列的子矩阵由原矩阵的第 44 行、第 55 行与第 11 列、第 33 列、第 44 列交叉位置的元素组成,为

6 5 6 7 5 6

其分值为: |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。

样例2:

该矩阵中分值最小的3行3列的子矩阵由原矩阵的第 44 行、第 55 行、第 66 行与第 22 列、第 66 列、第 77 列交叉位置的元素组成,选取的分值最小的子矩阵为

9 7 8 9 8 8 5 8 10

输出时每行末尾的多余空格,不影响答案正确性

要求使用「文件输入输出」的方式解题,输入文件为matrix.in,输出文件为matrix.out

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

题解:

知识点:动态规划+二进制枚举子集

分析:

首先这道题目我们可以很容易想到暴力, 如果剪枝得当是可以 AC 的。这道题目比较好的方法是 DP。

当选定的行固定时,问题变成:

给定一个长度为 m 的序列,从中选出一个长度为 c 的子序列。序列中的每个元素均有一个分值,且任意相邻两个被选出的元素,也会产生一个分值。问:如何选择子序列可使分值之和最小。

这是一个经典的序列DP模型:

状态表示:f[i][j]表示所有以第i个数结尾,且长度为j的子序列的分值之和的最小值。

状态计算:以倒数第二个数是哪个数为依据,将f[i][j]所代表的集合分成若干类,则倒数第二个数是第k个数的所有子序列的最小分值是f[k][j - 1] + cost(),其中cost是在序列末尾加上第i个数所产生的分值。

f[i][j]取所有类别的最小分值即可。

其中:

1、cw[i]表示第i列所贡献的上下之间的分值。

2、rw[i][j]表示第i列与第j列所贡献的左右之间的分值。注意题意里说的是先取一个子矩阵,然后是这个子矩阵里相邻的两数的分值。

3、f[i][j]表示当前选到第i列,一共选了j列,的最小分值。所以把 i 这一列加入的时候,需要加上第 i 列上下之间的分值以及 第 i 列和上一列 第 k 列 的左右之间的分值。

读者可以自己模拟一遍,或者用C++输出一下数据。

代码:

#include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include<cstdio> using namespace std; const int N = 20, INF = 1e9; int n, m, r, c; int matrix[N][N]; int f[N][N]; int cw[N], rw[N][N]; int q[N]; int count(int x){ int s = 0; for (int i = 0; i < n; i ++ ) s += x >> i & 1; return s; } int main(){ freopen("matrix.in","r",stdin); freopen("matrix.out","w",stdout); cin >> n >> m >> r >> c; for (int i = 0; i < n; i ++ ) for (int j = 0; j < m; j ++ ) cin >> matrix[i][j]; int res = INF; for (int state = 0; state < 1 << n; state ++ ) if (count(state) == r){ for (int i = 0, j = 0; i < n; i ++ ) if (state >> i & 1) q[j ++ ] = i; for (int i = 0; i < m; i ++ ){ cw[i] = 0; for (int j = 1; j < r; j ++ ) cw[i] += abs(matrix[q[j]][i] - matrix[q[j - 1]][i]); } for (int i = 0; i < m; i ++ ) for (int j = i + 1; j < m; j ++ ){ rw[i][j] = 0; for (int k = 0; k < r; k ++ ) rw[i][j] += abs(matrix[q[k]][i] - matrix[q[k]][j]); } for (int i = 0; i < m; i ++ ){ f[i][1] = cw[i]; for (int j = 2; j <= c; j ++ ){ f[i][j] = INF; for (int k = 0; k < i; k ++ ) f[i][j] = min(f[i][j], f[k][j - 1] + cw[i] + rw[k][i]); } res = min(res, f[i][c]); } } cout << res << endl; return 0; }
http://www.jsqmd.com/news/1028285/

相关文章:

  • i.MX51与Cortex-A8:经典嵌入式多媒体平台的架构、生态与开发实践
  • 硫酸钙防静电高品质地板品牌商哪家好?常辉映口碑值得选 - myqiye
  • Gemini官方入口全平台指南:从Chrome到鸿蒙的AI服务接入逻辑
  • 合肥工业大学LaTeX论文模板:三步快速完成专业论文排版
  • 2026年制造行业靠谱的GEO优化机构排名研究分析报告 - mypinpai
  • 嵌入式常见接口协议总结
  • 2026年6月自动加配料厂家推荐:十大排名专业评测案例价格适用场景 - 品牌推荐
  • OpenTelemetry Go配置热更新终极指南:无需重启应用的5个实用技巧
  • 山东宏元环保反应釜的价格,用户口碑如何 - myqiye
  • 3步轻松管理yuzu模拟器版本:告别手动更新的烦恼
  • 2026年淬火带钢与65Mn弹簧带钢生产厂家选购指南:行业实力企业甄选推荐 - 优质品牌商家
  • 【网工入门-eNSP模拟-07】三层交换机
  • 电动车托运找什么物流?这种专线能带电池发车 - 快递物流资讯
  • 5V转3.3V电源方案全解析:LDO、电荷泵与Buck转换器选型实战指南
  • 国密数据信封解析实战:从P7B文件提取SM2私钥完整指南
  • 2026年河北空气能热泵及机电暖通设备选购指南:河北商用空气能、超低温热泵、多联机中央空调设备及安装服务优选指南 - 海棠依旧大
  • 抛货发什么物流最便宜?寄半折5折起精准比价 - 快递物流资讯
  • MC1322x SMAC无线通信实战:从UART到PER测试的完整指南
  • 2026北京婚庆策划公司评测:北京启动球租赁/北京奠基仪式/北京奠基石/北京婚礼布置/5家品牌可靠性对比 - 优质品牌商家
  • 软件研发 --- AI MCP 之 trae中安装ssh-mcp
  • 别再盲目学代码了!零基础AI产品经理的技术学习标准答案
  • 2026年官方甄选:评价高的食品干燥机供应商推荐与工艺深度解析 - 优质品牌商家
  • 2026年成都方管批发怎么选?这份本地钢材市场参考指南请收好 - 优质品牌商家
  • 飞思卡尔C-5网络处理器DMA与内存配置驱动编程实战
  • 2025-2026年欧博东方文化传媒电话查询:辨别服务内容与核实官方渠道 - 品牌推荐
  • ControlNet-v1-1_fp16_safetensors快速入门指南:精准控制AI图像生成
  • 使用“redis+caffeine+节点通知”去优化redis频繁读取的性能问题
  • 煤炭能源类展会品牌推荐,2026 贵州能博会好不好? - myqiye
  • 分析靠谱的免费停车的电竞民宿有哪些 - mypinpai
  • 2026年q2泡沫包装供应商综合实力排行:成都,德阳,四川,箱体类泡沫箱/酒水类泡沫箱/食品类泡沫箱/优选推荐 - 优质品牌商家