题目传送

表示一开始也是一脸懵逼,虽然想到了DP,但面对多变的状态不知从何转移及怎么合理记录状态。之(借鉴大佬思路)后,豁然开朗,于是在AC后分享一下题解。

发现数据范围出奇地小,不过越是小的数据范围,算法的灵活性就越大。小数据对我们各个算法的组合及时间复杂度的掌握要求很高。面对二维的最优化选择,其实我们可以先通过搜索枚举出行的所有选择,存到一个数组team中,然后在行已经确认的情况下,跑一遍一维的DP:设dp[j][i]为在前j列选择i列的最优情况(为了方便,要求第i选择的列一定是第j列)。则状态转移方程就可写成:dp[j][i]=min(dp[j][i],dp[k][i-1]+lc[j]+hc[k][j]),其中lc为第j列的分值,hc[k][j]为第k列和第j列横向相邻元素对分值的贡献,k=i-1,i-1+1,...,j-1。对于lc和hk

我们可以在每次搜索完成后预处理一下,整个程序的时间复杂度即为O(C(n,r)*rm2),足以解出题。

代码上有一个小优化,详情见注释:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4
 5 using namespace std;
 6
 7 int n, m, r, c, num[17][17], ans = 0x7fffffff, team[17], lteam;
 8 int lc[17];     //列
 9 int hc[17][17]; //列之间
10 int dp[17][17];
11
12 void init()
13 {
14     for (int i = 1; i <= m; i++)
15     {
16         lc[i] = 0;
17         for (int j = 1; j < r; j++)
18             lc[i] += abs(num[team[j]][i] - num[team[j + 1]][i]);
19     }
20     for (int i = 1; i < m; i++)
21         for (int j = i + 1; j <= m; j++)
22         {
23             hc[i][j] = 0;
24             for (int k = 1; k <= r; k++)
25                 hc[i][j] += abs(num[team[k]][i] - num[team[k]][j]);
26         }
27 }
28
29 void DP()
30 {
31     for (int i = 1; i <= m; i++)
32         dp[i][1] = lc[i];
33     if (c == 1)
34     {
35         for (int i = 1; i <= m; i++)
36             ans = ans > dp[i][1] ? dp[i][1] : ans;
37         return;
38     }
39     for (int i = 2; i <= c; i++)
40     {
41         for (int j = i; j <= m - c + i; j++)
42         {
43             dp[j][i] = 0x2fffffff;
44             for (int k = j - 1; k >= i - 1; k--)
45                 dp[j][i] = min(dp[j][i], dp[k][i - 1] + lc[j] + hc[k][j]);
46         }
47     }
48     for (int i = c; i <= m; i++)
49         ans = min(ans, dp[i][c]);
50 }
51
52 void dfs(int now)
53 {
54     if (now > n)//选择完毕
55     {
56         init();
57         DP();
58         return;
59     }
60     if (r - lteam == n - now + 1)//当剩下的元素与还要选择的元素的数量相等时,必须要选
61     {
62         team[++lteam] = now;
63         dfs(now + 1);
64         --lteam;
65         return;
66     }
67     dfs(now + 1);//当前行要么不选
68     if (lteam < r)//要么在符合条件的情况下选
69     {
70         team[++lteam] = now;
71         dfs(now + 1);
72         --lteam;
73     }
74 }
75
76 int main()
77 {
78     scanf("%d%d%d%d", &n, &m, &r, &c);
79     for (int i = 1; i <= n; i++)
80         for (int j = 1; j <= m; j++)
81             scanf("%d", &num[i][j]);
82     dfs(1);
83     printf("%d", ans);
84     return 0;
85 }

转载于:https://www.cnblogs.com/InductiveSorting-QYF/p/11095230.html

洛谷P2258 子矩阵——题解相关推荐

  1. 洛谷 P2258 子矩阵

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

  2. 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]

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

  3. 洛谷P1816 忠诚 题解

    洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...

  4. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  5. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  6. 洛谷P2108学英语题解

    来我的博客里拥有更好的阅读体验:https://yyxi.ml/2020/07/23/luogu-p2108-xueyingyu/ 洛谷P2108学英语题解(c++) 题目描述 代码.思路 踩过的坑 ...

  7. 洛谷 P1077 摆花 题解

    洛谷 P1077 摆花 题解 洛谷 P1077 题目 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共mmm盆.通过调查顾客的喜好,小明列出了顾客最喜欢的nnn种花,从1到nnn标号.为 ...

  8. 修改数组(洛谷P7285题题解,C++语言描述)

    题目要求 P7285题目链接 分析 这题虽然是红题,但是因为很有趣且是 Special Judge ,所以写篇题解. 乍一看,这题好麻烦啊,要综合考虑xxx和yyy,达到x−yx-yx−y的最优化. ...

  9. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  10. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

最新文章

  1. B-tree/B+tree/B*tree
  2. PLMN选择,RPLMN、EPLMN、UPLMN、OPLMN、VPLMN、APLMN、FPLMN的概念
  3. DDos攻击,使用深度学习中 栈式自编码的算法
  4. C++二进制文件读写操作
  5. linux fastQC 操作命令,[Bio-Info]fq文件解析统计工具:FastQC在linux下初应用
  6. HDU Problem - 3085 Nightmare Ⅱ(双向BFS)
  7. php用ajaxs上传图片_jquery+ajax+php 图片上传
  8. apache lucene_Apache Lucene拼写检查器的“您是不是要”功能
  9. 分享一个JAVA专业接口开发利器,牛牛牛新鲜出炉!!!
  10. BiSeNet V2论文及源码
  11. asio定时器深度探析
  12. python能做什么项目-Python可以做大项目吗?
  13. 工单管理软件,免费工单管理系统
  14. 计算机开机无自检声音,电脑启动不了,开机无自检声音,显示器不亮
  15. 【webstorm】webstorm官网中文破解版
  16. org.tigris.subversion.javahl.ClientException: Attempted to lock an already-locke
  17. Win11找不到显卡控制面板怎么办?
  18. Redis学习笔记1-理论篇
  19. [JS] js-xlsx生成Excel(模拟下载)
  20. windows PHP 5 版本的下载

热门文章

  1. Prototype使用Template
  2. 给ApplicationContext容器中添加组件的方法(@Bean的使用)
  3. 3D Object Detection入门——PointRCNN代码学习
  4. 安装mujoco报错:distutils.errors.DistutilsExecError: command ‘gcc‘ failed with exit status 1
  5. 如何通俗易懂地理解基于模型的强化学习?
  6. [转]如何撰写学术论文
  7. require.js使用教程
  8. 关于多数据源(除自己数据库外,另一部分数据需通过接口调取第三方获取)的查询问题...
  9. c# winform 全角自动转化半角问题(C#中ImeMode的值):转载
  10. 蓝懿iOS培训日志22 图册