题目描述 Description
给出如下定义:

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

例如,下面左图中选取第2、4行和第2、4、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

的其中一个2*3的子矩阵是
4   7   4
8   6   9

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

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

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

(本题目为2014NOIP普及T4)

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

接下来的n行,每行包含m个用空格隔开的整数,用来表示问题描述中那个n行m列的矩阵。
输出格式:
输出共1行,包含1个整数,表示满足题目描述的子矩阵的最小分值。

 输入输出样例 Sample input/output
样例测试点#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
输入样例:

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

输出样例:

16

说明 description
【输入输出样例1说明】

该矩阵中分值最小的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。

【输入输出样例2说明】

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

【数据说明】

对于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。

思路:这题实在太难,不会......
代码如下:
 #include       <map>
#include <set>
#include <stack>
#include <cmath>
#include <ctime>
#include <queue>
#include <cstdio>
#include <vector>
#include <string>
#include <bitset>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std; #ifndef unix
#define lld "%I64d"
#define llu "%I64u"
#else
#define lld "%lld"
#define llu "%llu"
#endif #define FOR(a,b,c) for(int (a)=b;(a)<=(c);++(a))
#define FORD(a,b,c) for(int (a)=b;(a)>=(c);--(a))
#define FORV(a,t,b) for(vector<t>::iterator a=b.begin();a!=b.end();++a)
#define MAX(a,b) a=max(a,b)
#define MIN(a,b) a=min(a,b)
#define BLA printf("\n")
#define pb push_back
#define mp make_pair
#define gc getchar
#define RT return
#define BB second
#define AA first
#define bk break
#define LINF 0x3f3f3f3f3f3f3f3fll
#define INF 0x3f3f3f3f
#define eps 1e-8
#define DINF 1e20 //#define Generator typedef long long ll;
typedef unsigned ui;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<ll ,ll > pll; const int MAXN= ;
const int MOD = ; template <class T> inline void CLR(T &g) {T t;swap(t,g);}
template <class T> inline void CLR(T &g,int a){memset(g,a,sizeof g);}
template <class T> inline void CPY(T &a,T &b) {memcpy(a,b,sizeof a);}
template <class T> inline bool inr(T a,T b,T c) {RT (a>=b && a<=c);}
inline int acc(int a,int b) {RT !!(a & (<<b-));}
inline int fil(int a,int b,int c) {RT a & ~(<<b-) | (<<b-)*c;} int N, M, K, Q, R, C; int a[][];
int f[][];//f[i][j]表示 已经选择i列 上一列是j
int sum[], d[], csum[][];
/*========================================================*/
int main()
{
#ifndef Generator
#ifndef ONLINE_JUDGE
#endif
#endif //真
#ifdef Generator //正
freopen("input.txt","w",stdout); //有
srand((ui)time(NULL)); //用
#endif //的
int T, o=; //在
scanf("%d%d%d%d", &N, &M, &R, &C); //这
FOR(i, , N) //里
FOR(j, , M)
scanf("%d", &a[i][j]);
int ans=INF;
FOR(i, , (<<N)-){//枚举哪些行被选入矩阵
int cnt=;
FOR(j, , N)
if (acc(i, j)) d[++cnt]=j;
if (cnt != R) continue;
FOR(j, , M){
sum[j]=;
FOR(k, , R-)
sum[j] += abs(a[d[k]][j]-a[d[k+]][j]);
}
FOR(j, , M)
FOR(k, j+, M){
csum[j][k]=;
FOR(l, , R)
csum[j][k] += abs(a[d[l]][j]-a[d[l]][k]);
}
CLR(f, 0x3f);
f[][]=;
FOR(j, , C){
FOR(k, , M){
int tot=;
FOR(l, , k-)
MIN(f[j][k], f[j-][l]+csum[l][k]+sum[k]);
}
}
FOR(j, , M)
MIN(ans, f[C][j]);
}
printf("%d\n", ans);
RT ;
}
/*===================================================================*/

NOIP2014-普及组复赛-第四题-子矩阵的更多相关文章

  1. NOIP2010-普及组复赛-第四题-三国游戏

    题目描述 Description 小涵很喜欢电脑游戏,这些天他正在玩一个叫做<三国>的游戏.  在游戏中,小涵和计算机各执一方,组建各自的军队进行对战.游戏中共有 N 位武将(N为偶数且不 ...

  2. NOIP2018普及组复赛游记

    2018年11月10日,NOIP2018普及组复赛. 这是我初中阶段最后一次复赛了. 和往常一样,我们在预定的早上7点,没有出发. 10分钟之后,人终于到齐了,于是出发了,一路无话. 到了南航,合照三 ...

  3. 【NOIP2014 普及组】螺旋矩阵

    [NOIP2014 普及组]螺旋矩阵 一.题目 [NOIP2014 普及组]螺旋矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 0 [提交][状态][讨论版] 题目描 ...

  4. NOIP2016普及组复赛解题报告

    提高组萌新,DAY1DAY2加起来骗分不到300,写写普及组的题目聊以自慰. (附:洛谷题目链接 T1:https://www.luogu.org/problem/show?pid=1909 T2:h ...

  5. NOIP2005-普及组复赛-第三题-采药

    题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望的医师为师.医师为了判断他的资质,给他出了一个难题.医师把他带到一个到处都是草药的山 ...

  6. noip普及组考纲+样题合集——初级篇(OIer必看)

    很明显我是想发提高组合集的.普及组考纲……用发么. 当然如果你想看的话也可以,就一点点: 递归.排序…… 很明显上面那都不是重点.普及组只要掌握搜索.二分.单调队列.数学.随机化等等,一等奖没问题的, ...

  7. [NOIP2014普及组]子矩阵

    题目:洛谷P2258.Vijos P1914.codevs 3904. 题目大意:给你一个矩阵,要你找一个r行c列的子矩阵,求最小分值(子矩阵和分值的定义见原题). 解题思路:n和m比较小,考虑暴力. ...

  8. noip2014普及组——珠心算测验

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及.    某学校的珠心算老师采用一种快速考察珠 ...

  9. NOIP2014-普及组复赛-第三题-螺旋矩阵

    题目描述 Description 一个n行n列的螺旋矩阵可由如下方法生成: 从矩阵的左上角(第1行第1列)出发,初始时向右移动:如果前方是未曾经过的格子,则继续前进,否则右转:重复上述操作直至经过矩阵 ...

随机推荐

  1. spark yarn任务的executor 无故 timeout之原因分析

    问题: 用  spark-submit --master yarn --deploy-mode cluster --driver-memory 2G --num-executors 6 --execu ...

  2. idea新建项目文件名为红色的解决办法

    Perference->version Control ->Directory添加项目路径,vcs选<none> 即可.

  3. 数据集下载 MNIST

    The Street View House Numbers (SVHN) Dataset SVHN is a real-world image dataset for developing machi ...

  4. iOS GCD基础篇 - 同步、异步,并发、并行的理解

    1.关于GCD - GCD全称是Grand Central Dispatch  - GCD是苹果公司为多核的并行运算提出的解决方案  - GCD会自动利用更多的CPU内核(比如双核.四核)  - GC ...

  5. 添加JSTL 1.2 依赖库

    添加JSTL 1.2 依赖库 JSTL 是一项很有历史的技术,而且版本自Java 5以来长期停留在1.2.但在做简单演示的页面时jstl依然有用,当前我们依然能看到这项技术(在博客.文档的demo里很 ...

  6. OpenGL编译问题随手记

    1.error C2381: "exit" : 重定义:__declspec(noreturn) 不同 编译OpenGL   Red   Book   的例子时出现错误, stdl ...

  7. java中使用数组和链表简单实现SJBMap

    import java.util.LinkedList; public class SJBMap { private Object[] elementData; private int size; p ...

  8. Nodejs 学习

    1,Node.js REPL交互式解释器:nodejs安装完毕后,打开终端,进入到nodejs的安装目录下,输入node,进入到新的页面,该页面称为Node.js REPL (交互式解释器):可以简单 ...

  9. C# 语言规范_版本5.0 (第14章 枚举)

    1. 枚举 枚举类型 (enum type) 是一种独特的值类型(第 4.1 节),它用于声明一组命名的常量. 下面的示例 enum Color { Red, Green, Blue } 声明一个名为 ...

  10. django模板系统基础

    模板系统基础Django模板是一个string文本,它用来分离一个文档的展现和数据 模板定义了placeholder和表示多种逻辑的tags来规定文档如何展现 通常模板用来输出HTML,但是Djang ...