题目:洛谷P2258、Vijos P1914、codevs 3904。

题目大意:给你一个矩阵,要你找一个r行c列的子矩阵,求最小分值(子矩阵和分值的定义见原题)。

解题思路:n和m比较小,考虑暴力。

发现时间复杂度为$O(C_n^r ×C_m^c)$,可能会炸掉。因此考虑优化。

我们可以只暴力出行,然后通过dp求出和:

设f[i][j]表示选i列最后一个选j所得到的最小分值,x[i][j]表示第i列和第j列能产生的分值(不包括上下),y[i]表示第i列能产生出的分值(上下),这些都表示当前暴力到的状态。

则$f[i][j]=f[i-1][k]+y[j]+x[k][j](2\leq i\leq c,i\leq j\leq m,i-1\leq k\leq j-1)$,边界f[1][i]=y[i]。

最后答案为$min(f[c][i])(c\leq i\leq m)$。

dp时间复杂度是$O(m^3)$的,那么总时间复杂度优化到$O(C_n^r × m^3)$。

C++ Code:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#define For(i,a,b) for(register int i=a;i<=b;++i)
#define min(a,b) (((a)<(b))?(a):(b))
int a[17][17],n,m,r,c,num[17],ans,f[17][17],y[17],x[17][17];
void dp(){
memset(f,0x3f,sizeof f);
memset(f[1],0,sizeof f[1]);
memset(y,0,sizeof y);
memset(x,0,sizeof x);
For(i,1,m)For(j,2,r)
y[i]+=abs(a[num[j]][i]-a[num[j-1]][i]);
For(i,1,m)
For(j,i+1,m)
For(k,1,r)
x[i][j]+=abs(a[num[k]][i]-a[num[k]][j]);
memcpy(f[1],y,sizeof f[1]);
For(i,2,c)
For(j,i,m)
For(k,i-1,j-1)
f[i][j]=min(f[i][j],f[i-1][k]+y[j]+x[k][j]);
For(i,c,m)ans=min(ans,f[c][i]);
}
void dfs(int now){
if(now>r){
dp();
return;
}
For(i,num[now-1]+1,n){
num[now]=i;
dfs(now+1);
}
}
int main(){
ans=0x3f3f3f3f;
scanf("%d%d%d%d",&n,&m,&r,&c);
For(i,1,n)For(j,1,m)
scanf("%d",&a[i][j]);
num[0]=0;
dfs(1);
printf("%d\n",ans);
return 0;
}

[NOIP2014普及组]子矩阵的更多相关文章

  1. 【NOIP2014 普及组】螺旋矩阵

    [NOIP2014 普及组]螺旋矩阵 一.题目 [NOIP2014 普及组]螺旋矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 0 [提交][状态][讨论版] 题目描 ...

  2. 2014NOIP普及组 子矩阵

    觉得题目水的离开 觉得普及组垃圾的请离开 不知道 DFS 和 DP 的请离开 不屑的大佬请离开 ……. 感谢您贡献的访问量 ————————————————华丽的分割线 ——————————————— ...

  3. [NOIP2014] 普及组

    珠心算测验 模拟. 将所有“两个不同数之和”装进桶里,扫描原数组记录满足条件的数的个数. /*by SilverN*/ #include<iostream> #include<alg ...

  4. noip2014普及组——珠心算测验

    题目描述 珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术.珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及.    某学校的珠心算老师采用一种快速考察珠 ...

  5. 螺旋矩阵 noip2014普及组

    本题可以直接模拟填数字,也可以直接计算结果. 代码一:(这个代码,缺陷在于数组太大,浪费内存啊.另外,循环次数也不少.总之,时间空间的消耗都不小.) /*======================= ...

  6. noip2014普及组 比例简化

    题目描述 在社交媒体上,经常会看到针对某一个观点同意与否的民意调查以及结果.例如,对某一观点表示支持的有1498 人,反对的有 902人,那么赞同与反对的比例可以简单的记为1498:902. 不过,如 ...

  7. [NOIP2014普及组T1]珠心算测验 - NTT

    求数组有多少个数,恰好等于集合中另外两个(不同的)数之和? 注意到数集比较小,而且涉及到下标的加法,可以很自然地想到卷积 注意减去自己加自己的贡献 真是一道NTT练手好题 #include <i ...

  8. NOIP2002-2017普及组题解

    虽然普及组一般都是暴力省一,但是有一些题目还是挺难的qwq个人觉得能进TG的题目会在前面打上'*' NOIP2002(clear) #include<bits/stdc++.h> usin ...

  9. [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址

    题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...

随机推荐

  1. mysql裸文件备份XtraBackup (innobackupex)

    结构如下: 热备分为逻辑备份和裸文件备份. 裸文件备份比逻辑备份在速度上更快一些,因为它在底层复制数据文件.世界上唯一一款开源的,能够对INNODB和XtrDB数据库进行热备的开源工具. 他的优点是备 ...

  2. (转载)所有分类 > 开发语言与工具 > 移动开发 > Android开发 Android中的Service:默默的奉献者 (1)

    前言 这段时间在看一些IPC相关的东西,这里面就不可避免的要涉及到service,进程线程这些知识点,而且在研究的过程中我惊觉自己对这些东西的记忆已经开始有些模糊了——这可要不得.于是我就干脆花了点心 ...

  3. jQuery学习(五)——使用JQ完成复选框的全选和全不选

    1.在系统后台进行人员管理时,进行批量删除,使用jq完成全选和全不选 步骤分析: 第一步:引入jquery文件 第二步:书写页面加载函数 第三步:为上面的复选框绑定单击事件 第四步:将下面所有的复选框 ...

  4. 大神js总结

    http://www.cnblogs.com/tylerdonet/p/5543813.html http://www.codesec.net/list/8/

  5. QT笔记 -- (4) 为QLabel添加鼠标响应方法2

    1.实现 bool eventFilter(QObject *target,QEvent *event) 函数内容如下: bool eventFilter(QObject *target,QEvent ...

  6. ASM磁盘组中的AU与条带

    一.AU与条带(AU和条带就是一个分配单位,数据会被以一定单位分割,存储在多个磁盘中.分割单位的大小由AU.条带来决定. ASM有两种条带: 1.不可调粗粒度: 相当于ASM没有条带,或者说AU就是条 ...

  7. oc语言的特点

    oc语言的特点分为以下几个方面: 1.运行时: 2.block闭包: 3.内存管理: 4.大中枢派发: 一.运行时的基础是isa 类结构:由clang编译前端支撑. 从它衍生出以下几个特征: 1.消息 ...

  8. easyui的datagrid右侧没有边框线

    做项目时,用的easyui的框架的datagrid,运行时发现右侧没有边框,其它的都有边框,使用网页的审查元素可以看到datagrid样式里的宽度没有自动减去2个像素,这些都是easyui自算的宽高, ...

  9. DCDCBigBig's first blog @cnblogs~

    其实初二末的时候我就在CSDN上开了博客(主要是为了存模板),但是无奈CSDN的页面真的太辣眼睛了…… 然后我就加入博客园欢快的大家庭啦!!!顺便膜拜巨佬学长%%%(我是蒟蒻不要喷我) 页面设置感谢x ...

  10. 【hackerrank week of code 26】Hard Homework

    [题目链接]:https://www.hackerrank.com/contests/w26/challenges/hard-homework/problem [题意] 给你一个式子:sin(x)+s ...