又是dp

暴力枚举会T

考虑先固定一个变量,比如先枚举行

然后预处理每行之间的绝对值,每列之间的绝对值

然后dp进行转移

注意记录选择的行数

转移记得加上新选的列的行之间的绝对值,即w[i],

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 int n, m, r, c;
 7 int a[20][20], f[20][20];//f[i][j]表示选择了i列,最后一列为j
 8 int w[20], v[20][20], path[20];
 9 int ans=1<<30;
10 void work(){
11     memset(f,127,sizeof(f));
12     memset(w,0,sizeof(w));
13     memset(v,0,sizeof(v));
14     for(int i=1; i<=m; i++)
15         for(int j=1; j<r; j++)
16             w[i]+=abs(a[path[j]][i]-a[path[j+1]][i]); //记录已选择的行之间第i列的绝对值
17     for(int i=1; i<=m; i++)
18         for(int j=i+1; j<=m; j++)
19             for(int k=1; k<=r; k++)
20                 v[i][j]+=abs(a[path[k]][i]-a[path[k]][j]); //预处理每列之间的绝对值差
21     f[0][0]=0;
22     for(int i=1; i<=c; i++)
23         for(int j=i; j<=m; j++)
24             for(int k=0; k<j; k++)
25                 f[i][j]=min(f[i][j], f[i-1][k]+w[j]+v[k][j]);//dp
26     for(int i=c; i<=m; i++) ans=min(ans, f[c][i]); //寻找答案
27
28 }
29 void dfs(int now, int pre){
30     if(now>r){
31         work();
32         return ;
33     }
34     for(int i=pre+1; n-i>=r-now; i++){
35         path[now]=i;
36         dfs(now+1, i);
37     }
38 }
39 int main(){
40     scanf("%d%d%d%d",&n,&m,&r,&c);
41     for(int i=1; i<=n; ++i)
42         for(int j=1; j<=m; ++j)
43             scanf("%d",&a[i][j]);
44     dfs(1, 0);
45     cout<<ans<<endl;
46     return 0;
47 }

转载于:https://www.cnblogs.com/Aze-qwq/p/9879711.html

题解:子矩阵(NOIP2014普及组T4)相关推荐

  1. 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)

    P1914子矩阵 Accepted 标签:NOIP普及组2014[显示标签] 描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵 ...

  2. 信息学奥赛一本通 1965:【14NOIP普及组】珠心算测验 | 洛谷 P2141 [NOIP2014 普及组] 珠心算测验

    [题目链接] ybt 1965:[14NOIP普及组]珠心算测验 洛谷 P2141 [NOIP2014 普及组] 珠心算测验 [题目考点] 1. 枚举 [解题思路] 解法1:枚举判断每个数字是否是加和 ...

  3. 信息学奥赛一本通 1967:【14NOIP普及组】螺旋矩阵 | 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵

    [题目链接] ybt 1967:[14NOIP普及组]螺旋矩阵 洛谷 P2239 [NOIP2014 普及组] 螺旋矩阵 类似考题: 洛谷 P1014 [NOIP1999 普及组] Cantor 表 ...

  4. NOIP2012 普及组 T4 文化之旅

    文化之旅 (NOIP2012 普及组 T4 ) 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文 ...

  5. [NOIP2014 普及组] 珠心算测验

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

  6. P2141 [NOIP2014 普及组] 珠心算测验————C++

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

  7. NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)

    题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每 ...

  8. 子矩阵(NOIP2014 普及组第四题)

    描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与 列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2.4 行和第 2.4.5 列交叉位置 ...

  9. 【NOIP2014普及组】子矩阵

    题目 题目描述 给出如下定义:      1. 子矩阵: 从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序) 被称为原矩阵的一个子矩阵.       例如,下面左图中选取第 ...

最新文章

  1. VTK:可视化算法之LOxGrid
  2. java getstringbounds_java-AttributedString的FontMetrics.getStringBounds给出...
  3. 设计模式:装饰模式(Decorator)
  4. 在Corporate Network里配置SAP Cloud Connector连接SAP云平台,需要设置代理
  5. 【HDU - 5456】Matches Puzzle Game(数位dp,思维)
  6. PHP 常用数据库操作
  7. 关于在头文件中定义变量
  8. MongoDB与阿里云达成战略合作,最新数据库独家上线阿里云!
  9. STM32板子电源绘制原理
  10. 开源 Asp.net mvc 用户中心(nUserCenter) 产品机会评估
  11. 浏览器的加载顺序与页面性能优化
  12. 前端常见浏览器兼容性问题解决方案
  13. ctf逆向解题——re1
  14. 静态页面通过AJAX+asp实现数据查询功能
  15. Jenkins Config File Provider 插件 创建kubeconfig文件
  16. cdr怎么抠图轮廓线条_CDR怎么抠图?CorelDRAW快速抠图方法
  17. carsim2020.0的教程在“将HDWDZDPPV6 替换成 复制的HostID”这个步骤总是安装失败,解决这个问题,成功安装carsim2020.0的经验
  18. 安得与君相决绝,免教生死作相思
  19. 微光医疗/软件测试工程师实习面试
  20. 笔记随笔(ing):计算机视觉部分

热门文章

  1. Express使用进阶:cookie-parser中间件实现深入剖析
  2. 学号:201621123032 《Java程序设计》第3周学习总结
  3. 数据操纵:SELECT, INSERT, UPDATE, DELETE
  4. innodb 共享表空间 转 独立表空间 详细说明
  5. linux中程序包管理方式出现的原由(转载)
  6. STP状态切换详述(Cisco实现)
  7. fedora下java环境配置
  8. 用备份进行Active Directory的灾难重建
  9. Ubuntu 12.04下安装搜狗拼音 + 安装搜狗皮肤-转
  10. LeetCode345. Reverse Vowels of a String