洛谷P2258 子矩阵——题解




表示一开始也是一脸懵逼
,虽然想到了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),足以解出题。
代码上有一个小优化,详情见注释:
#include <iostream>
#include <cstdio>
#include <cmath> using namespace std; int n, m, r, c, num[][], ans = 0x7fffffff, team[], lteam;
int lc[]; //列
int hc[][]; //列之间
int dp[][]; void init()
{
for (int i = ; i <= m; i++)
{
lc[i] = ;
for (int j = ; j < r; j++)
lc[i] += abs(num[team[j]][i] - num[team[j + ]][i]);
}
for (int i = ; i < m; i++)
for (int j = i + ; j <= m; j++)
{
hc[i][j] = ;
for (int k = ; k <= r; k++)
hc[i][j] += abs(num[team[k]][i] - num[team[k]][j]);
}
} void DP()
{
for (int i = ; i <= m; i++)
dp[i][] = lc[i];
if (c == )
{
for (int i = ; i <= m; i++)
ans = ans > dp[i][] ? dp[i][] : ans;
return;
}
for (int i = ; i <= c; i++)
{
for (int j = i; j <= m - c + i; j++)
{
dp[j][i] = 0x2fffffff;
for (int k = j - ; k >= i - ; k--)
dp[j][i] = min(dp[j][i], dp[k][i - ] + lc[j] + hc[k][j]);
}
}
for (int i = c; i <= m; i++)
ans = min(ans, dp[i][c]);
} void dfs(int now)
{
if (now > n)//选择完毕
{
init();
DP();
return;
}
if (r - lteam == n - now + )//当剩下的元素与还要选择的元素的数量相等时,必须要选
{
team[++lteam] = now;
dfs(now + );
--lteam;
return;
}
dfs(now + );//当前行要么不选
if (lteam < r)//要么在符合条件的情况下选
{
team[++lteam] = now;
dfs(now + );
--lteam;
}
} int main()
{
scanf("%d%d%d%d", &n, &m, &r, &c);
for (int i = ; i <= n; i++)
for (int j = ; j <= m; j++)
scanf("%d", &num[i][j]);
dfs();
printf("%d", ans);
return ;
}
洛谷P2258 子矩阵——题解的更多相关文章
- 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ...
- 洛谷 P2258 子矩阵 解题报告
P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2 . 4行和第 ...
- 洛谷P2258 子矩阵
P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ...
- 洛谷 P2258 子矩阵
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- 洛谷P2258 子矩阵[2017年5月计划 清北学堂51精英班Day1]
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- 洛谷NOIp热身赛题解
洛谷NOIp热身赛题解 A 最大差值 简单树状数组,维护区间和.区间平方和,方差按照给的公式算就行了 #include<bits/stdc++.h> #define il inline # ...
- 洛谷P2827 蚯蚓 题解
洛谷P2827 蚯蚓 题解 题目描述 本题中,我们将用符号 ⌊c⌋ 表示对 c 向下取整. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓. 蛐蛐国里现 ...
- 洛谷P1816 忠诚 题解
洛谷P1816 忠诚 题解 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意.但是由于一些人 ...
- [POI 2008&洛谷P3467]PLA-Postering 题解(单调栈)
[POI 2008&洛谷P3467]PLA-Postering Description Byteburg市东边的建筑都是以旧结构形式建造的:建筑互相紧挨着,之间没有空间.它们共同形成了一条长长 ...
随机推荐
- Vijos lxhgww的奇思妙想--求K级祖先
给出一棵树求K级祖先.O(N*logN+Q) 更详细的讲解见:https://www.cnblogs.com/cjyyb/p/9479258.html /* 要求k级祖先,我们可以把k拆成" ...
- window10下搭建ELK环境
面向微服务开发时会涉及到多系统的日志跟踪,一旦出现问题过滤起来系统间切换非常麻烦,所以需要采用特定工具将日志统一归类处理,方便查询排查错误,下面将介绍一种开源的工具ELK. ELK由ElasticSe ...
- jmeter应用之批量插入数据
上一篇讲到如何在jmeter中配置并连接使用mysql数据库,这一节主要是讲数据库连接的简单应用——批量插入数据 总体步骤如下: 1)新建线程组和添加JDBC Connection Configura ...
- Luogu p1241 括号序列
括号序列题目连接 这是一道与dp毫无半点关系的题 本来是去找的题来着,结果并没有找到,然后看到了这道题. (本来以为会是很好写的一道题结果因为题意不清直接原地去世了) 思路很简单,基本没有技术含量. ...
- C++中的字符串类
1,本文分析 C++ 中的字符串,C 语言中的字符串利用的是 C 语言中的字符数组, 在 C 语言中没有真正意义上的字符串,利用了字符数组表示了字符串,最初设 计 C 语言仅仅是为了开发 Unix ...
- ajax异步加载分页评论带点赞功能
<script type="text/javascript" src="__ROOT__/Index/Tpl/Public/js/jquery.js"&g ...
- 卸载yum-mysql
注意事项:1. 卸载yum MYSQLsystemctl status mysqlsystemctl stop mysqlsystemctl disable mysqld rpm -qa | grep ...
- 洛谷 - P1346 - 电车 - Dijkstra/01BFS
https://www.luogu.org/problem/P1346 使用最短路之前居然忘记清空了. #include<bits/stdc++.h> using namespace st ...
- django前端分页小组件
# -*- coding:utf-8 -*- from django.utils.safestring import mark_safe class Page(object): def __init_ ...
- C#设计模式:解释器模式(Interpreter Pattern)
一,C#设计模式:解释器模式(Interpreter Pattern) 1,解释器模式的应用场合是Interpreter模式应用中的难点,只有满足“业务规则频繁变化,且类似的模式不断重复出现,并且容易 ...