CF461B Appleman and Tree
http://codeforces.com/problemset/problem/461/B
感觉这题有点玄学阿。。。。。怎么说呢。。。
状态1是x在有黑色的区域里面,状态0是只在白色区域里面,其实看一眼代码就懂了,一直想不出来我很难过。。。。
好菜呀,还要继续学树形dp才行阿
#include<iostream> #include<cstring> #include<vector> #include<algorithm> #include<queue> using namespace std; typedef long long ll; ll mod = 1e9 + 7; const int maxn = 2e5 + 11; vector<int>G[maxn]; void add(int be, int en) { G[be].push_back(en); } int list[maxn]; ll dp[maxn][3]; int dfs(int x, int fa) { for (int i = 0; i < G[x].size(); i++) { int p = G[x][i]; if (p == fa) continue; dfs(p, x); dp[x][1] = (dp[x][1] * (dp[p][1] + dp[p][0])) % mod + dp[x][0] * dp[p][1] % mod; dp[x][1] %= mod; dp[x][0] = dp[x][0] * (dp[p][0] + dp[p][1]) % mod; } return 0; } int n; int main() { cin >> n; int x, y; for (int i = 2; i <= n; i++) { cin >> x; add(x + 1, i); add(i, x + 1); } for (int i = 1; i <= n; i++) { cin >> list[i]; dp[i][list[i]] = 1; } dfs(1, -1); cout << dp[1][1] << endl; return 0; }
寻找真正的热爱