平面上有N个点,每个点选择上、下、左、右其中一个方向射出一条射线。求有多少种方案,使得没有射线穿过其余点且任意两条射线不相交。
N<=54。
我们考虑将横坐标相同的所有点当作一层。
然后现在从左到右扫。
对于一个点,如果它想要向左射,显然当前所有处理过的点中,向上射的点的纵坐标的最小值要大于当前点的纵坐标,向下射的点的纵坐标的最大值要小于当前点的纵坐标。因此DP状态要保留这两个值。
对于同一层中的最高点,它可以向上射,显然当前所有处理过的点中,向右射的点的纵坐标的最大值要小于当前点的纵坐标。同一层中的最低点,它可以向下射,需要保留向右射的点的纵坐标的最小值。
所以定状态要保留这四个值,转移显然。
一个状态若无用,就直接跳过。
应当采用顺推。
要注意考虑射线穿过点的情况,即往左和右射的时候。
滚动数组防止超时。