[洛谷P3943]:星空(DP+最短路)
题目传送门
题目背景
命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷。
你来过,然后你走后,只留下星空。
题目描述
逃不掉的那一天还是来了,小$F$看着夜空发呆。
天上空荡荡的,没有一颗星星——大概是因为天上吹不散的乌云吧。
心里吹不散的乌云,就让它在那里吧,反正也没有机会去改变什么了。
小$C$拿来了一长串星型小灯泡,假装是星星,递给小$F$,想让小$F$开心一点。不过,有着强迫症的小$F$发现,这串一共$n$个灯泡的灯泡串上有$k$个灯泡没有被点亮。小$F$决定和小$C$一起把这个灯泡串全部点亮。
不过,也许是因为过于笨拙,小$F$只能将其中连续一段的灯泡状态给翻转——点亮暗灯泡,熄灭亮灯泡。经过摸索,小$F$发现他一共能够翻转$m$种长度的灯泡段中灯泡的状态。
小$C$和小$F$最终花了很长很长很长很长很长很长的时间把所有灯泡给全部点亮了。他们想知道他们是不是蠢了,因此他们找到了你,让你帮忙算算:在最优的情况下,至少需要几次操作才能把整个灯泡串给点亮?
输入格式
从标准输入中读入数据。
输入第$1$行三个正整数$n,k,m$。
输入第$2$行$k$个正整数,第$i$个数表示第$i$个被没点亮的灯泡的位置$a_i$。
输入第$3$行$m$个正整数,第$i$个数表示第$i$种操作的长度$b_i$。
输出格式
输出标准输入中。
输出一行一个非负整数,表示最少操作次数。
样例
样例输入
5 2 2
1 5
3 4
样例输出
2
数据范围与提示
样例解释:
数据范围:
子任务会给出部分测试数据的特点。如果你在解决题目中遇到了困难,可以尝试只解决一部分测试数据。
每个测试点的数据规模及特点如下表:
特殊性质:保证答案小于$4$。
题解
发现$k$很小。
那么我们考虑转化这个问题,利用状压$DP$。
再想区间修改,离线,那么用差分,也就是异或差分。
问题转化为:
给定一个长度为$n$的$0/1$串,其中只有不超过$2k$个$0$。
每次操作是,从给定的$m$种距离中选择一种,选择序列上相距这个距离的两个位同时取反。
求至少需要操作多少次才能使得整个串全为$1$。
如果某个地方有$0$,那么这个位置一定会进行操作来消去这个$0$。
我们假定每次我们都选含$0$的来进行操作:
一个$1$一个$0$:可以视作移动;
两个$0$:看作将其中一个$0$移到另一个$0$的位置,随后它们均消去。
发现又可以转化问题:
给定一个有$n$个点的图,其中之后不超过$2k$个点存在物品。
每次操作时,从给定的$m$种距离中选择一种,选择序列上一个物品进行移动;两个物品碰到一起会消去。
求至少需要操作多少次才能使得所有物品消失。
消去的两个物品可以看作是其中一个移动到了另外一个物品的位置,代价即为从一个物品到另一个物品所需要的最小步数;
我们发现,这种移动只有$2k$个起点;
同时,图上$n$个点每个点有$m$条边;
因此,预处理两两之间所需要的最短步数可以使用$\Theta(n\times m\times k)$的$BFS$
最后一次转化问题:
有$2k$个物品,选择其中两个消去,分别有不同的代价,求使得所有物品消失的最小代价。
状压$DP$轻松解决。
时间复杂度:$\Theta(n\times m\times k+k\times 2^{2k})$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,k,m;
bool a[40001];
int b[100];
int dis[20][40001];
int dp[300000];
int cnt;
pair<int,int> p[20];
queue<int> q;
void bfs(pair<int,int> x)
{
dis[x.first][x.second]=0;
q.push(x.second);
while(q.size())
{
int flag=q.front();
q.pop();
for(int i=1;i<=m;i++)
{
if(flag-b[i]>=0&&dis[x.first][flag-b[i]]>dis[x.first][flag]+1)
{
dis[x.first][flag-b[i]]=dis[x.first][flag]+1;
q.push(flag-b[i]);
}
if(flag+b[i]<=n&&dis[x.first][flag+b[i]]>dis[x.first][flag]+1)
{
dis[x.first][flag+b[i]]=dis[x.first][flag]+1;
q.push(flag+b[i]);
}
}
}
}
int getans(int x)
{
if(dp[x]!=-1)return dp[x];
if(!x)return x;
int res=1<<30;
int flag=0;
while(!(x&(1<<flag)))flag++;
for(int i=flag+1;i<=2*k;i++)
if(x&(1<<i))res=min(res,getans(x^(1<<flag)^(1<<i))+dis[flag][p[i].second]);
dp[x]=res;
return res;
}
int main()
{
memset(dis,0x3f,sizeof(dis));
memset(dp,-1,sizeof(dp));
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++)
{
int x;
scanf("%d",&x);
a[x]=1;
}
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
for(int i=0;i<=n;i++)
if(a[i]!=a[i+1])
p[cnt]=make_pair(cnt++,i);
for(int i=0;i<cnt;i++)
bfs(p[i]);
cout<<getans((1<<cnt)-1);
return 0;
}
rp++
[洛谷P3943]:星空(DP+最短路)的更多相关文章
- 洛谷P3943 星空
洛谷P3943 星空 题目背景 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. 题目描述 逃不掉的那一天还是来了,小 F 看着夜空发呆. 天上空荡荡的,没有一颗 ...
- 洛谷 P3943 星空
题目背景 命运偷走如果只留下结果, 时间偷走初衷只留下了苦衷. 你来过,然后你走后,只留下星空. 题目描述 逃不掉的那一天还是来了,小 F 看着夜空发呆. 天上空荡荡的,没有一颗星星——大概是因为天上 ...
- 洛谷P3943 星空——题解
一道很好的锻炼思维难度的题,如果您能在考场上直接想出来的话,提高组450分以上就没问题了吧.(别像作者一样看了好几篇题解才勉强会) 先提取出题目大意:给定一个长度n<=40000的01串,其中1 ...
- 洛谷P3943星空
啦啦啦啦——又是五月天的歌,题目传送门 这道题比之前两道真的不是同一级别的,这里我这个蒟蒻也讲不清,不如看下这位大佬的吧,他的写的已经非常清楚了:Z-Y-Y-S,这里我就只放下我的代码,也是按照这位大 ...
- CodeForces 79D 【Password】,洛谷P3943 【星空】
其实我做的是洛谷的P3943,但是听说fstqwq窃题...... 题目描述: 小 C 拿来了一长串星型小灯泡,假装是星星,递给小 F,想让小 F 开心一点.不过,有 着强迫症的小 F 发现,这串一共 ...
- 洛谷教主花园dp
洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价 ...
- 洛谷 p6858 深海少女与胖头鱼 洛谷月赛 期望dp
洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...
- 洛谷P4719 动态dp
动态DP其实挺简单一个东西. 把DP值的定义改成去掉重儿子之后的DP值. 重链上的答案就用线段树/lct维护,维护子段/矩阵都可以.其实本质上差不多... 修改的时候在log个线段树上修改.轻儿子所在 ...
- 2018普及组摆渡车洛谷5017(dp做法)
啦啦啦,这一篇是接上一篇的博客,上一篇是记忆化搜索,而这一篇是dp+前缀和小技巧 dp这种玄学做法我这种蒟蒻当然不是自己想出来的,参考https://blog.csdn.net/kkkksc03/ar ...
随机推荐
- [Python3 填坑] 017 实例方法、静态方法、类方法的区别
目录 1. print( 坑的信息 ) 2. 开始填坑 2.1 先上例子 2.2 分析 1. print( 坑的信息 ) 挖坑时间:2019/04/07 明细 坑的编码 内容 Py024-1 实例方法 ...
- Lpl and Energy-saving Lamps
During tea-drinking, princess, amongst other things, asked why has such a good-natured and cute Drag ...
- 接口测试工具——postman
Postman 之前是作为Chrome 的一个插件,现在要下载应用才能使用. 以下是postman 的界面: 各个功能区的使用如下: 快捷区: 快捷区提供常用的操作入口,包括运行收藏夹的一组测试数据, ...
- python 导入re模块语法及规则
正则表达式是功能比较强大的模块,应用在很多地方,抓网页,数据分析,数据验证等,下面讲述python 导入re模块语法及规则. 1,re模块语法 re.match 从头开始匹配 re.search 匹配 ...
- docker私有仓库部署
首先科普docker几种“仓库”概念,可分为:本地镜像,本地仓库,公有仓库(docker hub) 本地镜像:在把java程序打包成镜像,输出的镜像的位置就是本地镜像 公有仓库:一个叫docker h ...
- PgSQL · 特性分析 · PG主备流复制机制
原文地址:http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...
- KNN算法项目实战——改进约会网站的配对效果
KNN项目实战——改进约会网站的配对效果 1.项目背景: 海伦女士一直使用在线约会网站寻找适合自己的约会对象.尽管约会网站会推荐不同的人选,但她并不是喜欢每一个人.经过一番总结,她发现自己交往过的人可 ...
- 了解Greenplum (2)
一.目的 1. 理解Greenplum中的数据分布策略(random 和 distribution),分析不同分布策略的优劣:2. 理解查询执行中的数据广播和数据重分布,分析在何种情况下选择哪种策略, ...
- Nginx优化_压缩处理与内存缓存
对页面进行压缩处理; 服务器内存缓存. 1.对页面进行压缩处理 [root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf http { ... gzip ...
- linux权限管理—基本权限
目录 Linux权限管理-基本权限 一.权限的基本概述 二.权限修改命令chmod 三.基础权限设置案例 四.属主属组修改命令chown Linux权限管理-基本权限 一.权限的基本概述 1.什么是权 ...