题目链接
预处理标记每个点j秒后的影响
进行迭代加深记忆化搜索即可
#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define pass puts("pass")
#define LL long long
#define N 20
#define M 1000
using namespace std;
int n;
int fa[N];
int a,s,k,v;
int f[N][N];
int flag[1<<17];
void dfs(int x) {
if(v==a) {//满足条件退出
cout<<k<<endl;
exit(0);
}
if(x==k) return;
for(int i=1; i<=n; i++) {//枚举选点
v^=f[i][k-x];
if(x<flag[v]) {//记忆化搜索
flag[v]=x;
dfs(x+1);
}
v^=f[i][k-x];
}
dfs(x+1);//不标记点
}
int main() {
cin>>n;
for(int i=2; i<=n; i++)
cin>>fa[i];//输入爸爸
for(int i=1; i<=n; i++) {
cin>>s;
a=a*2+s;//输入最终状态,转为2进制
}
//求标记第i个点j秒后会影响的点(2进制)
for(int i=1; i<=n; i++) {
int x=i;
for(int j=1; j<=n; j++) {
if(x)//特判 x为0不会影响点
f[i][j]=f[i][j-1]|(1<<(n-x));
else
f[i][j]=f[i][j-1];
x=fa[x];//向上移
}
}
for(k=0; k<=n; k++) {//迭代加深
memset(flag,10,sizeof(flag));
dfs(0);
}
puts("frog");
return 0;
}