先声明一下下述的变量
N为总天数,
A[i]表示第i个数字,
f[i]和g[i]的定义见下文
Max=max(f[i])1<=i<=N
第一问就是个最简单的最长下降序列,f[i]表示当前包含第i个数字的最长下降序列,
第二问稍复杂,我的分析:
我的代码(因为答案可能很大,所以用了高精度,并重载了"+"运算
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了
我的代码(有些慢):
1.构图
2.求出所有可能的满足拓扑序的答案并输出
1.的关键是题目的条件(每条边至少能看到1点)
2.这时用DFS求拓扑序好像就不管用了,所以采用暴力搜索去寻求答案,并满足拓扑序,
那就是记录一下每个矩形的出度,如果出度为0,说明当前可以继续搜(没有矩型被他压着),继续向下搜索,并删除该矩形(把压着他的矩形的出度-1),然后递归到下一层再找出度为0的矩形,这样就可以了.
描述
看下面的五张 9 x 8 的图像:
........ ........ ........ ........ .CCC.... EEEEEE.. ........ ........ ..BBBB.. .C.C.... E....E.. DDDDDD.. ........ ..B..B.. .C.C.... E....E.. D....D.. ........ ..B..B.. .CCC.... E....E.. D....D.. ....AAAA ..B..B.. ........ E....E.. D....D.. ....A..A ..BBBB.. ........ E....E.. DDDDDD.. ....A..A ........ ........ E....E.. ........ ....AAAA ........ ........ EEEEEE.. ........ ........ ........ ........ 1 2 3 4 5
现在,把这些图像按照 1—5 的编号从下到上重叠,第 1 张在最下面,第 5 张在最顶端。如果一张图像覆盖了另外一张图像,那么底下的图像的一部分就变得不可见了。我们得到下面的图像:
.CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..
对于这样一张图像,计算构成这张图像的矩形图像从底部到顶端堆叠的顺序。
下面是这道题目的规则:
第一行
|
两个用空格分开的整数:图像高 H (3 <= H <=30) 和图像宽 W (3 <= W <= 30) 。 |
第二行到第 H+1 行
|
H 行,每行 W 个字母。 |
按照自底向上的顺序输出字母。如果有不止一种情况,按照字典顺序输出每一种情况(至少会有一种合法的顺序)。
9 8 .CCC.... ECBCBB.. DCBCDB.. DCCC.B.. D.B.ABAA D.BBBB.A DDDDAD.A E...AAAA EEEEEE..
EDABC