模拟题,当然也可以叫树形dp。
数据结构作业,所以要写一棵树,为了可读性,又手残枚举了三种颜色,所以代码显得长一些,但是整个的思路还是非常的好理解的。而且变量名也尽量取得即使长一些也是很好理解的,呵呵...
亮出15CM-->
/*
链接http://acm.fzu.edu.cn/problem.php?pid=1022
187 ms 2180KB
*/
/*********by JBer********/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
/*
树形dp,定义状态dp[i][j]表示结点i颜色为j(下面枚举对应,记0为绿色) 时可以搞到
的最大答案
转移:
dp[father][0] = max{dp[leftson][1]+1, dp[leftson][2]+1};
dp[father][1] = max{dp[leftson][0], dp[leftson][2]};
dp[father[2] = max{dp[leftson][0], dp[leftson][1]};
---当father只有左孩纸时
其它情况类似
初始化孩纸们的dp[][0] = 1, dp[][1] = dp[][2] = 0就可以搞了= =
*/
const int COLORTYPE = 3;
enum COLOR {GREEN, RED, BLUE, NONE};
struct Node {
Node* left, *right;
int maxGreen[COLORTYPE]; //maxGreen[i]该结点颜色为i时可以搞出的最大绿色结点数目
int minGreen[COLORTYPE]; //和上面差不多=