题目传送门(内部题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)的更多相关文章

  1. 2018.10.17 NOIP模拟 管道(状压dp)

    传送门 状压dp好题. 怎么今天道道题都有点东西啊 对于今天题目神仙出题人先膜为上策:%%%%DzYoAk_UoI%%%% 设f[i][j]f[i][j]f[i][j]表示选取点的状态集合为iii,当 ...

  2. 2018.09.08 NOIP模拟 division(状压dp)

    这么sb的题考场居然写挂了2233. 假设n=∏iaiki" role="presentation" style="position: relative;&qu ...

  3. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  4. 4.26 省选模拟赛 T3 状压dp 差分求答案

    LINK:T3 比较好的题目 考试的时候被毒瘤的T2给搞的心态爆炸 这道题连正解的思路都没有想到. 一看到题求删除点的最少个 可以使得不连通. 瞬间想到最小割 发现对于10分直接跑最小割即可. 不过想 ...

  5. NOIp模拟赛 巨神兵(状压DP 容斥)

    \(Description\) 给定\(n\)个点\(m\)条边的有向图,求有多少个边集的子集,构成的图没有环. \(n\leq17\). \(Solution\) 问题也等价于,用不同的边集构造DA ...

  6. 【CSP模拟赛】Adore(状压dp 二进制)

    题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...

  7. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  8. 【62测试】【状压dp】【dfs序】【线段树】

    第一题: 给出一个长度不超过100只包含'B'和'R'的字符串,将其无限重复下去. 比如,BBRB则会形成 BBRBBBRBBBRB 现在给出一个区间[l,r]询问该区间内有多少个字符'B'(区间下标 ...

  9. 【XSY2745】装饰地板 状压DP 特征多项式

    题目大意 你有\(s_1\)种\(1\times 2\)的地砖,\(s_2\)种\(2\times 1\)的地砖. 记铺满\(m\times n\)的地板的方案数为\(f(m,n)\). 给你\(m, ...

随机推荐

  1. yield浅析-Python3

    yield 浅析 先来一段代码: def fun1(): for i in range(5): yield i print("继续调用继续执行") gen1 = fun1() pr ...

  2. Mysql8 root密码忘记了

    需要确定自己的mysql版本是否是8 [root@smonitor ~]# mysql --version mysql Ver 8.0.13 for Linux on x86_64 (MySQL Co ...

  3. Springboot实现上传文件接口,使用python的requests进行组装报文上传文件的方法

    记录瞬间 近段时间使用Springboot实现了文件的上传服务,但是在使用python的requests进行post上传时,总是报错. 比如: 1.Current request is not a m ...

  4. 对xxl-job进行simpleTrigger并动态创建任务扩展

    业务场景 需求上要求能实现quartz的simpleTrigger任务,同时还需要动态的创建任务而非在控制面板上创建,查阅xxl-job官方文档发现simpelTrigger其暂时还躺在to do l ...

  5. kill指定用户所有进程

    在linux系统管理中,我们有时候需要kill某个用户的所有进程,这里有以下几种方法,以heboan用为例 pkill方式 pkill -u heboan killall方式 killall -u h ...

  6. 04 Websocket和Websocketed

    一.web socket事件和方法 有了HTTP协议为什么还需要Websocket这种协议呢?因为HTTP协议发起的通信只能通过客户端发起,然后服务端才可以将消息回应到客户端.因此HTTP协议做不到服 ...

  7. vue中添加与删除,关键字搜索

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. vue-cli常用配置

    官方配置表:https://cli.vuejs.org/zh/config/#publicpath 1.vue inspect > output.js 将配置按webpack.config.js ...

  9. vue 内存数组变化监听

    watch: { carts: { handler(val, oldVal) { subtotal(this.carts); console.log(this.carts) }, deep: true ...

  10. 2019.9.27PHP基础

    PHP 基础语法规范: 1 <?php 开头 ?>结尾 2 php可以单独存在也可以和html等结合使用 3后缀名一般以.php结尾 php4,php5,php6,php7,phtml. ...