Codeforces Round #384 (Div. 2) ABCD题解

一位著名的CF玩家曾经说过,不要用Java做CF。
不然就是这样:用ArrayList的代码,用Vector的代码。

快速版题解:
A、B、C水题,D树形dp。手速场无误。

A
题意:就是有n个城市,你要从a点到b点。然后0表示没有机场,1表示有机场。问你要转多少飞机。
思路:神特么水题。。。
代码:384A

B
题意:样例很清楚了
思路:因为是对称的,如果在右边就对称回来,再求解子问题
代码:384B

C
题意:题意很清楚给你一个n,要你把2/n拆成1/x+1/y+1/z,如果拆不了输出-1。
思路:1/n=1/(n+1)+1/(n*(n+1))
代码:384C

D
题意:给你一个有根树,让你选两个节点,要求这两个节点下面的子树不相交。问,最大权值。
思路:

  • 树形dp。dp[x][0]表示整个以x为根的子树的全部和;dp[x][1]表示以x为根的子树按题目要求再选一次,能拿到的结果;dp[x][2]表示从x为根的子树里面任选一个节点时能拿到的最大值。
  • 所以dp[x][0]=sum(dp[next][0]);
    dp[x][2]=max(dp[x][0], dp[nexti][0]);
    dp[x][1]=max(dp[nextk][1], max(dp[nexti][2]+dp[nextj][2]))

代码:384D

你可能感兴趣的:(Codeforces Round #384 (Div. 2) ABCD题解)