子矩阵

子矩阵


题目描述

给出如下定义:

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

如,下面左图中选取第

2

4

2、4

2、4行和第

2

4

5

2、4、5

2、4、5列交叉位置的元素得到一个

2

×

3

2×3

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

2×3

2×3的子矩阵是

4 7 4

8 6 9

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

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

本题任务:给定一个

n

n

n行

m

m

m列的正整数矩阵,请你从这个矩阵中选出一个

r

r

r行

c

c

c列的子矩阵,使得这个子矩阵的分值最小,并输出这个分值。

(本题目为2014NOIP普及T4)


输入

第一行包含用空格隔开的四个整数

n

,

m

,

r

,

c

n,m,r,c

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

接下来的

n

n

n行,每行包含

m

m

m个用空格隔开的整数,用来表示问题描述中那个

n

n

n行

m

m

m列的矩阵。


输出

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


样例输入

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

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,r,c,a[20][20];
int type[15010],cnt,nm[15010][20],ans;
int sum[20][15010],g[20][20][15010],f[20][20][15010];
inline int abss(int x)
{
if(x>=0) return x;
return -x;
}
void dfs(int x,int t,int k)
{
if(x==m+1)
{
if(t==c) type[++cnt]=k;
return;
}
dfs(x+1,t+1,k+(1<<(x-1)));
dfs(x+1,t,k);
}
int main()
{
int i,j;
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(1,0,0);
for(i=1;i<=cnt;++i)
for(j=0;j<m;++j)
if(nm[i][0]==c) break;
else
if(type[i]&(1<<j)) nm[i][++nm[i][0]]=j+1;
for(i=1;i<=n;++i)
for(j=1;j<=cnt;++j)
for(int k=2;k<=c;++k)
sum[i][j]+=abss(a[i][nm[j][k-1]]-a[i][nm[j][k]]);
for(i=1;i<n;++i)
for(j=i+1;j<=n;++j)
for(int k=1;k<=cnt;++k)
for(int l=1;l<=c;++l)
g[i][j][k]+=abss(a[i][nm[k][l]]-a[j][nm[k][l]]);
memset(f,127/3,sizeof(f));
for(i=1;i<=n;++i)
for(j=1;j<=cnt;++j)
f[i][0][j]=0,f[i][1][j]=sum[i][j];
for(i=2;i<=n;++i)
for(j=2;j<=min(r,i);++j)
for(int k=1;k<=cnt;++k)
for(int l=1;l<i;++l)
f[i][j][k]=min(f[i][j][k],f[l][j-1][k]+g[l][i][k]+sum[i][k]);
ans=0x7fffffff;
for(i=r;i<=n;++i)
for(j=1;j<=cnt;++j)
ans=min(ans,f[i][r][j]);
printf("%d\n",ans);
return 0;
}

[状压DP]子矩阵的更多相关文章

  1. 【BZOJ5010】【FJOI2017】矩阵填数 [状压DP]

    矩阵填数 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 给定一个 h*w 的矩阵,矩阵的行 ...

  2. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  3. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  4. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  5. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  6. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  7. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

  8. HDU 1074 Doing Homework (状压dp)

    题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...

  9. 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP

    [BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...

随机推荐

  1. HTML5 tag you don't know

    HTML5 tag you don't know a collection of html5 tag very little be used in practices semantic element ...

  2. 2019 front-end job Interview

    2019 front-end job Interview 2019 前端面试题 掘金 https://juejin.im/tag/面试 https://juejin.im/post/5c875791e ...

  3. taro 滚动事件

    taro 滚动事件 taro scroll bug ScrollView https://nervjs.github.io/taro/docs/components/viewContainer/scr ...

  4. Masterboxan INC发布印尼电商市场报告

    据海外媒体报导,Masterboxan INC(编号:20151264097)发布了印尼电商市场观察报告,指出印尼电商市场仍然有很大的发展潜力. Masterboxan INC表示,与发达国家从 PC ...

  5. Java后台防止客户端重复请求、提交表单

    前言 在Web / App项目中,有一些请求或操作会对数据产生影响(比如新增.删除.修改),针对这类请求一般都需要做一些保护,以防止用户有意或无意的重复发起这样的请求导致的数据错乱. 常见处理方案 1 ...

  6. 剑指 Offer 64. 求1+2+…+n + 递归

    剑指 Offer 64. 求1+2+-+n Offer_64 题目描述 题解分析 使用&&逻辑短路规则来终止循环 package com.walegarrett.offer; /** ...

  7. 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列

    剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...

  8. 【免费开源】基于Vue和Quasar的crudapi前端SPA项目实战—环境搭建 (一)

    背景介绍和环境搭建 背景 crudapi增删改查接口系统的后台Java API服务已经全部可用,需要一套后台管理UI,主要用户为开发人员或者对计算机有一定了解的工作人员,通过UI配置元数据和处理业务数 ...

  9. calcite 概念和架构

    1. 前言 Flink使用Calcite构造SQL引擎,那么他们 是怎么合作的? drill, hive,storm 和其他的一干apache 大数据引擎也用calcite , 那么对于同一个sql  ...

  10. vscode动态调试

    前言: 关于vscode动态调试php项目其实在网上有文章,但那些文章或多或少都有些坑点或者转载他人,未经验证过,几度重装系统重新配置的时候在网上看文章配置总是有点问题,所以这次自己写了一篇文章,从头 ...