(UPC寒假15)问题 D: 子矩阵(枚举+dp,中等题)

前言:有点题感后,看到矩阵,条件是求最小,很容易想到要用到dp(动态规划),但之前没遇到过枚举+dp的组合,有三个难点:
1、dp数组的含义(知道后,相应的状态转移方程也就出来了)
2、问题分解(一种思维模式,下面详解)
3、别被for循环绕晕

问题 D: 子矩阵

题目描述
给出如下定义:
子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵。

例如,下面左图中选取第2、4行和第2、4、5列交叉位置的元素得到一个2*3的子矩阵如右图所示。
在这里插入图片描述
相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的。
矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和。

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

输入

第一行包含用空格隔开的四个整数n,m,r,c,意义如问题描述中所述,每两个整数之间用一个空格隔开。
接下来的n行,每行包含m个用空格隔开的整数,用来表示问题描述中那个n行m列的矩阵。

输出

输出共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

样例输出

6
提示
该矩阵中分值最小的2行3列的子矩阵由原矩阵的第4行、第5行与第1列、第3列、第4列交叉位置的元素组成,为
6 5 6
7 5 6
,其分值为
|6−5| + |5−6| + |7−5| + |5−6| + |6−7| + |5−5| + |6−6| =6。

对于50%的数据,1 ≤ n ≤ 12,1 ≤ m ≤ 12,矩阵中的每个元素1 ≤ a[i][j] ≤ 20;
对于100%的数据,1 ≤ n ≤ 16,1 ≤ m ≤ 16,矩阵中的每个元素1 ≤ a[i][j] ≤ 1,000,1 ≤ r ≤ n,1 ≤ c ≤ m.

个人思维过程:
(第一印象)
又要选r行,又要选c列,再看这题的数据范围比较小,第一印象是枚举所有行列组合,用dfs1枚举行的组合,再dfs2枚举列的组合,再把每次选出的a[i][j],放到另一个b[][]数组,死求矩阵分值。

下面反例片段

int ss(){
   
	int cnt=0;
	for(int i=1;i<=r;i++){
   
		for(int j=2;j<=c;j++)
			cnt+=abs(b[i][j]-b[i][j-1]);
	}
	for(int i=1;i<=c;i++){
   
		for(int j=2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值