子矩阵

子矩阵


题目描述

给出如下定义:

  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. WebView & iframe

    WebView & iframe https://developer.android.com/reference/android/webkit/WebView.html Web-based c ...

  2. 百万SPC即将空投,3.0公链NGK有多“豪横”?

    在1月2日晚间,比特币强势突破3万美金,随后还在一路上涨,现在价格33431.64美金.仅用了不到一个月的时间,比特币就从2万美金涨到了3万美金,这充分展示了市场对于数字货币的强烈信心.没有了天花板的 ...

  3. NGK DeFi Baccarat怎么玩能赚钱?

    市面上大多数DeFi项目都是基于以太坊来开发的,除了吞吐量低.存储量小以及交易速度慢等问题以外,高额的Gas手续费将不少终端用户拒之门外. 基于此NGK.IO推出了低门槛的DeFi项目-- Bacca ...

  4. 类属性和__init__的实例属性有何区别?进来了解一下吧

    真的是随笔写的一篇,以防日后记忆模糊,特此记录.大佬勿喷 疑问:类属性和实例属性有何区别? 正题,代码如下 age为People类的属性(称为类属性) name是在__init__方法下,在创建实例对 ...

  5. (转载)VoLTE简介

    转载地址:http://www.360doc.cn/article/2909773_637471256.html,本文介绍了移动通信领域相关概念,如CS.PS.VoIP.VoLTE.IMS.CSFB. ...

  6. Zookeeper从入门到删库跑路

    导语 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等.Zookeeper是hadoop的一个子项 ...

  7. 鸿蒙开源第三方组件——进度轮ProgressWheel

    目录:1.前言2.背景3.组件功能展示4.Sample解析5.Library解析6.作者系列文章合集 前言 基于安卓平台的进度轮组件ProgressWheel(https://github.com/A ...

  8. 维格表2月更新:智能图表上线,唤醒全量工作数据堪比AI

    你是否曾经想过,你的维格表数据有朝一日变化出如科幻电影般的数据图表? 你是否感到厌倦,对当前的后台系统密密麻麻的数据累觉不爱? 你是否一直期待,拥有一个专属大数据 BI 看板,让你的规划如有神助,挥斥 ...

  9. sql注入和union all关联查询的学习总结

    1.后台从页面取值进行sql查询时最好不要直接拼,如下代码: String sql = "SELECT wo.* " + " from push_command pu & ...

  10. mybites框架遇到的坑之Mapper.xml文件不要随意加注释和ORA-00911

    原文链接:https://blog.csdn.net/streetlight8023/article/details/69388495/ 先说解决方法: org.mybatis.spring.MyBa ...