4.1中的奶牛家秘术和Fence Rails都是要加好几个剪枝才可以AC的问题
搜索对象:每个栅栏(rail)对应那个Board(可能的深度太大而答案很可能在很浅的地方,所以迭代深度去找(DFSID),如果某个深度找到一个可行解,立刻退出,再搜索下一个深度)
一般优化都可以从以下3点考虑:
1.可行性剪枝 如果我们预料到某种情况无论再怎么搜索也得不到可行解,那就直接退出
2.最优化剪枝 如果我们预料到某种情况无论再怎么走索也得不到比当前最优解更优的解,那也直接退出
3.搜索顺序 良好的搜索顺序会更快的找到答案
其他技巧因问题而不同
那么Fence Rails可以这样剪枝:
1.可行性: 如果当前剩下的不可用的Board(即不能再切出rails的board)的和比board总面积减去rails的总面积还大,那肯定不可行(通俗地讲就是不能再装Rails的面积比装满所有rails剩下来的面积大)
2.搜索顺序: 容易想到,如果刚开始的时候就用大的rail塞到较小的board中,很快就能找到可行解
3.注意有很多重复,考虑到重复的元素位置不同没有影响,所以如果上一个元素和该元素相同,那么所在的board就直接从上一个开始枚举
这样就可以AC了
我的代码(有些慢):