[CSP-S模拟测试]:装饰(状压DP)
题目传送门(内部题114)
输入格式
第一行一个正整数$n$。
接下来一行$n-1$个正整数,第$i$个数为$f_{i+1}$。
接下来一行$n$个数,若第$i$个数为$0$则表示林先森希望$i$号点的彩灯是关闭状态,若第$i$个数为$1$则表示林先森希望$i$号点的彩灯是开启状态。
输出格式
输出一行一个整数,表示林先森最少需要几秒才能看到他期望看到的树。
样例
样例输入1:
4
1 2 3
0 1 1 0
样例输出1:
2
样例输入2:
7
1 1 2 2 3 3
0 1 1 1 0 0 1
样例输出2:
3
数据范围与提示
样例解释:
第一个样例:
$\bullet$第一秒林先森拨动$3$号点的开关,彩灯状态变为$0\ 0\ 1\ 0$。
$\bullet$第二秒林先森什么也不做,彩灯状态变为$0\ 1\ 1\ 0$,满足要求。
第二个样例:
$\bullet$第一秒林先森拨动$4$号点的开关,彩灯状态变为$0\ 0\ 0\ 1\ 0\ 0\ 0$。
$\bullet$第二秒林先森拨动$7$号点的开关,彩灯状态变为$0\ 1\ 0\ 1\ 0\ 0\ 1$。
$\bullet$第三秒林先森拨动$1$号点的开关,与$2$号点传递的拨动效果抵消,彩灯状态变为$0\ 1\ 1\ 1\ 0\ 0\ 1$,满足要求。
数据范围:
对于$30\%$的数据,$n\leqslant 8$。
对于另$30\%$的数据,林先森希望看到所有彩灯都被点亮。
对于$100\%$的数据,$1\leqslant n\leqslant 16$。
题解
数据范围较小,考虑状压$DP$。
因为答案最大为$n$,所以我们可以枚举秒数。
设$dp[i][state]$表示第$i$秒,状态为$state$是否可行。
因为开关只与正负是否相同有关,而与具体是开还是关无关,所以我们可以假设最终的状态为起始状态,然后想办法转移到$0$状态(其实就是代码复杂度低一点而已)。
预处理出来每个点会对其它的点在下一秒做的贡献即可。
时间复杂度:$\Theta(2^nn^2)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n,state;
int fa[20],Map[20][20];
bool dp[20][100000];
int main()
{
scanf("%d",&n);
for(int i=0;i<=n;i++)Map[1][i]=1;
for(int i=2;i<=n;i++)
{
Map[i][0]=1<<(i-1);
scanf("%d",&fa[i]);
int now=i;
for(int j=1;j<=n;j++)
{
now=fa[now];
if(now)Map[i][j]=Map[i][j-1]|(1<<(now-1));
else Map[i][j]=Map[i][j-1];
}
}
for(int i=1;i<=n;i++){int x;scanf("%d",&x);state|=x<<(i-1);}
dp[0][state]=1;
for(int i=0;i<=n;i++)
{
if(dp[i][0]){printf("%d",i);break;}
for(int s=1;s<(1<<n);s++)
if(dp[i][s])
{
dp[i+1][s]=1;
for(int j=1;j<=n;j++)
dp[i+1][s^Map[j][i]]=1;
}
}
return 0;
}
rp++
[CSP-S模拟测试]:装饰(状压DP)的更多相关文章
- 2018.10.17 NOIP模拟 管道(状压dp)
传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...
- 2018.09.08 NOIP模拟 division(状压dp)
这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...
- 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)
[描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...
- 4.26 省选模拟赛 T3 状压dp 差分求答案
LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...
- NOIp模拟赛 巨神兵(状压DP 容斥)
\(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- 6.28 NOI模拟赛 好题 状压dp 随机化
算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...
- 【62测试】【状压dp】【dfs序】【线段树】
第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...
- 【XSY2745】装饰地板 状压DP 特征多项式
题目大意 你有\(s_1\)种\(1\times 2\)的地砖,\(s_2\)种\(2\times 1\)的地砖. 记铺满\(m\times n\)的地板的方案数为\(f(m,n)\). 给你\(m, ...
随机推荐
- HTML5自学
1.1 标题文本 在HTML5中,文本的结构除了以行和段落出现之外,还可以作为标题存在,通常一篇文档最基本的结构就是由不同级别的标题和正文组成的. 例如1:(中国门户网站) https://www ...
- TCP三次握手与四次挥手详解(最全面)
目录 TCP的三次握手与四次挥手 TCP报文段的首部格式 TCP的工作原理 TCP 的流量控制 TCP的拥塞控制 拥塞控制与流量控制的关系 拥塞控制所起的作用 慢开始和拥塞避免 慢开始算法的原理 三次 ...
- shell脚本获取的参数
$# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表
- Brain的同步规则
这段话来自Java编程思想并发一章 什么时候使用同步 如果你正在写一个变量,它可能接下来将被另一个线程读取,或者正在读取一个上一次已经被另一个线程写过的变量,那么你必须使用同步,并且,读写线程都必须用 ...
- Hadoop组成架构
Hadoop是apache用来“处理海量数据存储和海量数据分析”的分布式系统基础架构,更广义的是指hadoop生态圈.Hadoop的优势 高可靠性:hadoop底层维护多个数据副本,即使某个计算单元故 ...
- JS基础_基本语法
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Get MySQL这5个优化技巧
一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善.这篇文章主要谈谈MySQL数据库在发展周期中所面临的问题及优化方案,暂且抛开前端应用不说,大 ...
- webpack4 打包
1. 基本安装及命令 npm config set registry https://registry.npm.taobao.org // 淘宝镜像npm install webpack-c ...
- (转)java并发编程:CopyOnWriteArrayList
原文链接:http://ifeve.com/java-copy-on-write/ Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容, ...
- 批处理 使用默认浏览器 打开html文件
@echo offfor /f "tokens=3,4" %%a in ('"reg query HKEY_CLASSES_ROOT\http\shell\open\co ...