Could anyone please explain to me how to solve this dp problem? Link:https://atcoder.jp/contests/dp/tasks/dp_p Please help?
# | User | Rating |
---|---|---|
1 | tourist | 4009 |
2 | jiangly | 3823 |
3 | Benq | 3738 |
4 | Radewoosh | 3633 |
5 | jqdai0815 | 3620 |
6 | orzdevinwang | 3529 |
7 | ecnerwala | 3446 |
8 | Um_nik | 3396 |
9 | ksun48 | 3390 |
10 | gamegame | 3386 |
# | User | Contrib. |
---|---|---|
1 | cry | 166 |
2 | maomao90 | 163 |
2 | Um_nik | 163 |
4 | atcoder_official | 161 |
5 | adamant | 160 |
6 | -is-this-fft- | 158 |
7 | awoo | 157 |
8 | TheScrasse | 154 |
9 | nor | 153 |
9 | Dominater069 | 153 |
Could anyone please explain to me how to solve this dp problem? Link:https://atcoder.jp/contests/dp/tasks/dp_p Please help?
Name |
---|
This can be solved by tree dp concept that dp table can be updated from leaf toward to root. Lets assume you are at node now and define the do table like this. dp[current][0]:possible number of current == black dp[current][1]:possible number of current == white
"child1" "child2" ... "childK"
If current is black, then all childs should be white:
dp[current][black] = dp[child1][white] * dp[child2][white]*...*dp[childK][white];
If current is white, then all childs color does not matter:
dp[current][white] = (dp[child1][white] + dp[child1][black]) * (dp[child2][white] + dp[child2][black])*...*(dp[childK][white] + dp[childK][black]);
After update all nodes, the last one will be the root node and answer is dp[root][white] + dp[root][black].
My submission: https://atcoder.jp/contests/dp/submissions/12971991
dp[current][black] = dp[child1][white] * dp[child2][white]*...*dp[childK][white]; why u multiplied ?
Because those are independent incidents so total possible way of state is multiplication of all sub incidents' answers. Example: Root(Black:6) = Child1[Black:2] * Child2[Black:3] ==> total 2 * 3 = 6 ways.