NOIP 2014 普及组 T4 子矩阵
【题意】
已知:n,m,r,c,a[i][j]
(1 ≤ n ≤ 16, 1 ≤ m ≤ 16,1 ≤ a[i][j] ≤1000,1 ≤ r ≤ n, 1 ≤ c ≤ m)
条件:矩阵的分值定义为每一对相邻元素之差的绝对值之和
求:n*m的矩阵中找出r*c的子矩阵,使其分值最小
【构思】
对于一维的问题,就是只有一行,那么很好解决;
子矩阵,找r行,再找c列;
找r行,搜索,2^r;
然后对于列的处理,可以转化为一维的情况,发现也可以用DP;
所以时间复杂度为O(2^r*c*c)
【实现】
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <climits>
using namespace std;
const int N=17;
int n,m,r,c,p[N][N],v[N],f[N],res=INT_MAX,t[N],t1[N][N];
void init(void)
{
scanf("%d%d%d%d",&n,&m,&r,&c);
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) scanf("%d",&p[i][j]);
}
int min(int i,int j)
{
return i<j?i:j;
}
int DP(void)
{
memset(t,0,sizeof t);
memset(t1,0,sizeof t1);
for (int i=1;i<=m;i++)
for (int j=1;j<v[0];j++) t[i]+=abs(p[v[j]][i]-p[v[j+1]][i]);
for (int i=1;i<m;i++)
for (int j=i+1;j<=m;j++)
for (int k=1;k<=v[0];k++) t1[i][j]+=abs(p[v[k]][i]-p[v[k]][j]);
for (int i=1;i<=m;i++) f[i]=t[i];
for (int i=2;i<=c;i++)
for (int j=m;j>=i;j--)
{
f[j]=INT_MAX;
for (int k=j-1;k>=i-1;k--) f[j]=min(f[j],f[k]+t1[k][j]);
f[j]+=t[j];
}
int ans=INT_MAX;
for (int i=c;i<=m;i++) ans=min(ans,f[i]);
return ans;
}
void DFS(int i,int dep)
{
if (dep==r)
{
res=min(res,DP());
return;
}
for (int j=i;j<=n-r+dep+1;j++)
{
v[++v[0]]=j;
DFS(j+1,dep+1);
v[v[0]--]=0;
}
}
void work(void)
{
DFS(1,0);
printf("%d\n",res);
}
int main(void)
{
init();
work();
return 0;
}
【回顾】
[1] 对于棋盘上的01选择问题,通常行用搜索,列用其他方法,降低时间复杂度
[2] 棋盘的问题,把二维转化为一维,这种思想可以延伸为特殊问题的普遍性,然后再把普遍性和特殊性建立一定的联系
NOIP 2014 普及组 T4 子矩阵的更多相关文章
- NOIP 2014 普及组 T3 螺旋矩阵
[题意] 已知:n,r,c(n<=30000) 条件:给定n行n列的螺旋矩阵(从矩阵的左上角(1,1)出发,初始时向右移动:如果前方是未曾经过的格子, 则继续前进,否则右转:重复上述操作直至经过 ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2018 普及组 解题报告
目录 标题统计 题目链接 思路 代码 龙虎斗 题目链接: 思路 代码 摆渡车 题目链接: 思路 对称二叉树 题目链接 思路: 先来解释一下为毛现在才来发解题报告: 其实博主是参加过NOIP 2018普 ...
- 洛谷P1067 多项式输出 NOIP 2009 普及组 第一题
洛谷P1067 多项式输出 NOIP 2009 普及组 第一题 题目描述 一元n次多项式可用如下的表达式表示: 输入输出格式 输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数. ...
- noip 2014 提高组初赛
noip 2014 提高组初赛 一. TCP协议属于哪一层协议( ) A. 应用层 B. 传输层 C. 网络层 D. 数据链路层 B TCP(传输控制协议) 若有变量int a; float: x, ...
- NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)
题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...
- NOIP2015普及组T4推销员(暴力+线段树)
题目:阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有N家住户,第i家住户到入口的距离为Si米.由于同一栋房子里 ...
- NOIP 2014 提高组 Day2
期望得分:100+60+30=190 实际得分:70+60+30=160 https://www.luogu.org/problem/lists?name=&orderitem=pid& ...
- NOIP 2014 提高组 Day1
期望得分:100+100+50=250 实际得分:100+100+50=250 此次NOIP ZJ省一分数线:500,SD:345 https://www.luogu.org/problem/lis ...
随机推荐
- Java CSV操作(导出和导入)
Java CSV操作(导出和导入) CSV是逗号分隔文件(Comma Separated Values)的首字母英文缩写,是一种用来存储数据的纯文本格式,通常用于电子表格或数据库软件.在 CSV文件 ...
- MySQL(五) —— 子查询
子查询(SubQuery)是指出现在其他SQL语句内的SELECT语句. 如: SELECT * FROM t1 WHERE col1 = (SELECT col2 FROM t2); 其中 SELE ...
- Using Post_Query Trigger in Oracle Forms
When a query is open in the block, the Post-Query trigger fires each time Form Builder fetches a rec ...
- git bash下的选择、复制、粘贴
1. 打开git bash 2.点击左上角,选择属性,打钩 3.回到界面,选择一行文字,然后点击 “右键”,这样就复制到剪切板了.再点 “右键”,可以粘贴到命令窗口中了.
- Entity Framework 学习初级篇--基本操作:增加、更新、删除、事务(转)
摘自:http://www.cnblogs.com/xray2005/archive/2009/05/17/1458568.html 本节,直接写通过代码来学习.这些基本操作都比较简单,与这些基本操作 ...
- Windows Internals学习笔记(三)Procdump的使用
参考资料: 1. 下载地址 2. 使用示例
- Python基础学习笔记(八)常用字典内置函数和方法
参考资料: 1. <Python基础教程> 2. http://www.runoob.com/python/python-dictionary.html 3. http://www.lia ...
- JS学习笔记(一) 概述
参考资料: 1. http://www.w3school.com.cn/js/ 2. http://www.liaoxuefeng.com/wiki/001434446689867b27157e896 ...
- Sublime Text 2 快捷键用法大全(转)
Ctrl+D 选词 (反复按快捷键,即可继续向下同时选中下一个相同的文本进行同时编辑)Ctrl+G 跳转到相应的行Ctrl+J 合并行(已选择需要合并的多行时)Ctrl+L 选择整行(按住-继续选择下 ...
- T-SQL over()函数在单个表中的聚合
Sales.OrderValues是一个视图,在这里作为测试表. 现在想实现,每个订单的数据行新增两个列,totalvalue(所有订单的总金额),custtotalvalue(当前订单的custid ...