呵呵,其实是废话,标程是按照题解写的,数据是根据标程生成的。题解错了当然全错。
下面我说说我对题解的看法,大家一起来看看。
光从状态设计来说,我认为不够。“设DP[I,0]表示第I个节点不放人时看守住以I为根的树所需要的人数的最小值,DP[I,1]表示第I个节点放人时看守住以I为根的树所需要的人数的最小值。”
状态转移:“
DP[I,1]=求和(min(DP[k,0],DP[k,1]))(k为孩子节点)
DP[I,0]=求和(min(DP[k,0],DP[k,1]))+DP[u,1]”
DP[I,0]的转移没有问题。但是DP[I,1]的转移有问题。它取得是每个孩子(设为J)放人或不放人看守住J这颗子树的最小人数。但是,不难想到,如果J节点不放人,且J节点本身未被看守住。这种状态也能转移到DP[I,1]的。(因为DP[I,1]中I节点上是放人的,能看守住J。)所以这时状态转移是不全面的。归根结底是状态设计的不全面。
我觉得应该设计三个状态。a[i]表示该节点放人。b[i]表示该节点不放人,但是已经被罩。c[i]表示该节点不放人,并且未被罩。状态转移方程和之前类似。复杂度不变。