[状压DP]子矩阵
子
矩
阵
子矩阵
子矩阵
题目描述
给出如下定义:
- 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵
如,下面左图中选取第
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
相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的。
矩阵的分值:矩阵中每一对相邻元素之差的绝对值之和。
本题任务:给定一个
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]子矩阵的更多相关文章
- 【BZOJ5010】【FJOI2017】矩阵填数 [状压DP]
矩阵填数 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 给定一个 h*w 的矩阵,矩阵的行 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
随机推荐
- how to copy to clipboard using windows cmd
how to copy to clipboard using windows cmd Windows clipboard command line https://www.labnol.org/sof ...
- components & slot
components & slot vue https://github.com/vuejs/rfcs/blob/master/active-rfcs/0001-new-slot-syntax ...
- 2. Vue语法--插值操作&动态绑定属性 详解
目录 1. 设置vue模板 2. vue语法--插值操作 3. 动态绑定属性--v-bind 一. 设置vue模板 我们经常新建一个vue项目的时候, 会写如下的一段代码 <!DOCTYPE h ...
- mybites框架遇到的坑之Mapper.xml文件不要随意加注释和ORA-00911
原文链接:https://blog.csdn.net/streetlight8023/article/details/69388495/ 先说解决方法: org.mybatis.spring.MyBa ...
- XSS跨站脚本攻击(1)
将跨站脚本攻击缩写为XSS,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面的时候,嵌入其中的Web里面的Script代码就会被执行,从而达到恶意攻击用户的目的. 反射型XSS 反射 ...
- 几种常见css布局
单列布局 第一种 给定宽度,margin:auto 即可实现 html <div class="header"></div> <div class=& ...
- 聊一聊JVM
JVM 什么是JVM? JVM是java虚拟机的缩写,本质上是一个程序,能识别.class字节码文件(.java文件编译后产生的二进制代码),并且能够解析它的指令,最终调用操作系统上的函数,完成我 ...
- Spring Boot 老启动失败,这次再也不怕了!
Spring Boot 项目是不是经常失败,显示一大堆的错误信息,如端口重复绑定时会打印以下异常: *************************** APPLICATION FAILED TO ...
- PVE连接Wi-Fi
连接wifi参考文章: https://lzxz1234.cn/archives/417 services看不全信息 connmanctl> services 之后信息太多,看不到上面的怎么办? ...
- C语言相关的基础字符串函数
C语言中没有专门的字符串类型,所以就用字符数组和字符指针形式表示 1 char arr[]="abcdef"; //字符数组表示的字符串 2 char*arr="abce ...