[状压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) ...
随机推荐
- github & webhooks
github & webhooks git auto commit bash shell script https://developer.github.com/webhooks/ POST ...
- image to cur (cursor icons)
image to cur (cursor icons) mouse-cursor-pointer https://onlineconvertfree.com/convert-format/jpg-to ...
- API protocols All In One
API protocols All In One SOAP vs. REST vs. JSON-RPC vs. gRPC vs. GraphQL vs. Thrift https://www.mert ...
- Captain technology开发的新能源汽车强在哪里?
在新能源汽车飞速发展的这些年,Captain technology 认识到,要改变有状况,就要不断创新,调整新能源汽车发展路线.新能源汽车本质永远是汽车, Captain technology是在改变 ...
- 一款基于 Web 的通用数据管理工具(转载)
一款基于 WEB 的通用数据管控工具 - CloudQuery 前言 前段时间,公司因为业务发展,数据量攀升,老板迫切需要一个工具对数据进行精细化管理,一是确实需要精细化管理:二是因为我们公司小,数据 ...
- 微信小程序切换标签改变样式
微信小程序切换标签改变样式 wxml <!--顶部导航栏--> <view class="swiper-tab"> <view class=" ...
- msfconsole 常用命令记录
Metasploit是一款开源的渗透测试框架,它现在还在逐步发展中,下面介绍的一些功能和命令,可能会在未来失效. Metasploit框架提供了多种不同方式的使用接口: msfgui msfconso ...
- 《深入浅出WPF》-刘铁猛学习笔记——XAML
XAML是什么? XAML是微软公司创造的一种开发语言,XAML的全称是 Extensible Application Markup Language,即可拓展应用程序标记语言. 它由XML拓展而来, ...
- MySql_176. 第二高的薪水 + limit + distinct + null
MySql_176. 第二高的薪水 LeetCode_MySql_176 题目描述 题解分析 代码实现 # Write your MySQL query statement below select( ...
- PAT-1152(Google Recruitment)字符串+素数
Google Recruitment PAT-1152 本题最需要注意的是最后输出要以字符串形式输出,否则可能会出现前导0的情况. /** * @Author WaleGarrett * @Date ...