题目:洛谷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. BOOL的getter方法

    在代码中经常会看到这样的属性声明 @property (nonatomic,assign,getter = isRead)BOOL read; 这行代码的意思就是,声明一个BOOL类型的read,但是 ...

  2. 移动端video播放时不弹出页面层

    移动端视频在播放时会主动弹出页面,有的浏览器不会.对那些会的浏览器进行处理: 直接加上下面三个属性即可,兼容方面就不说了,微信上是很ok的. <video x5-playsinline=&quo ...

  3. POJ 1182 食物链 【并查集】

    解题思路:首先是没有思路的----然后看了几篇解题报告 http://blog.csdn.net/ditian1027/article/details/20804911 http://poj.org/ ...

  4. map、栈————下一个更大的元素(待定,栈解法学习中)

    方法一 先遍历nums2,将每个元素后面第一个大的元素一起存入到map中,然后在遍历nums1,在map中找到. class Solution { public: vector<int> ...

  5. python学习笔记第三章

    1.列表是由一系列特定顺序排列得元素组成,在python中用([])组成,列表得索引是从0开始,不是1 xu=['a','b',''c] print(xu) 访问列表的元素第一个元素 xu=['a', ...

  6. GDOI2018爆炸记

    Day0 12:45p.m. 从初中部出发前回班探望了一下同学,受到热烈欢迎(?) 13:15p.m. 出发去中山,路上本来想用mac看fz的,结果ass字幕导入失败,心态爆炸*1:后来成功获取xfz ...

  7. 平衡二叉树(AVLTREE,双链表实现)

    首先说下好久没更新了,最近打游戏和工作都有点多,o(^▽^)o. 写这个AVL发现自己的代码风格好差,尤其是变量命名这块,后来意识到了,想去改,但是太多了,改了几个就不想改了,做这个是记录下自己的成长 ...

  8. finger---用于查找并显示用户信息

    finger finger命令用于查找并显示用户信息.包括本地与远端主机的用户皆可,帐号名称没有大小写的差别.单独执行finger指令,它会显示本地主机现在所有的用户的登陆信息,包括帐号名称,真实姓名 ...

  9. 洛谷 P1855 榨取kkksc03 (二维费用背包)

    加多一维就行了 #include<cstdio> #include<algorithm> #include<cstring> #define REP(i, a, b ...

  10. 紫书 例题 11-1 UVa 12219 (表达式树)

    这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...