题目描述 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. Unity 发布到IOS,Android的各种坑

    Unity 发布到IOS的注意事项1.开发环境MAC环境:Xcode环境 7.2.1Unity环境:Unity5.32.基本说明首先,我说一下,这是我在对Unity发布到IOS的实际使用中,总结出来的 ...

  2. Python学习笔记——进阶篇【第九周】———协程

    协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来 ...

  3. Python学习笔记——基础篇【第五周】——random & time & datetime模块

    random模块 随机数 mport random print random.random() print random.randint(1,2) print random.randrange(1,1 ...

  4. 每天学习一点点...css...

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. VM10下Ubuntu无法安装vim的问题

    今天在VM10下重装了Ubuntu14.10,安装vim时发现如下问题 谷歌了一下,终于找到一种方法解决. 终端下: sudo vi /etc/apt/source.list 该命令将用vi打开一个文 ...

  6. S.O.L.I.D五大原则之单一职责SRP

    转自 : 汤姆大叔的blog Bob大叔提出并发扬了S.O.L.I.D五大原则,用来更好地进行面向对象编程,五大原则分别是: The Single Responsibility Principle(单 ...

  7. HttpHelps类

    /// <summary> /// 类说明:HttpHelps类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理 /// 重要提示 ...

  8. window.open实现模式窗口(只弹出一个window.open)

    父页面 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> & ...

  9. pychon - selenium2Libray源码简介

    I. Introduction Selenium2Library是robot framework中主流的测试网页功能的库, 它的本质是对webdriver的二次封装, 以适应robot框架. 百度上一 ...

  10. Mybatis(一)

     jdbc开发 1)优点:简单易学,上手快,非常灵活构建SQL,效率高 2)缺点:代码繁琐,难以写出高质量的代码(例如:资源的释放,SQL注入安全性等) 开发者既要写业务逻辑,又要写对象的创建和销毁, ...