递归的经典题目就是汉诺塔问题,从2个金片的转移,到n个金片(将上面n-1个看成是一个,相当于2个的情况)
另外,SDUTOJ上3479-青蛙过河问题,大概就是类似汉诺塔,两岸都是一个柱子,必须遵循汉诺塔规则,河里s个柱子和y片荷叶。不过s个柱子上是汉诺塔的柱子,但是y片荷叶上只能有站一个青蛙,并且出左岸不能回去,进右岸也不能回来,可以左岸直接跳到右岸,求能过去的最大青蛙数。其实归根到底,求的就是,能过去的最大的青蛙编号。
一开始没想递归去做,简单的想到了(s+1)(y+1),WA了之后,反应过来,可以在柱子上进行操作,让它堆得更高。
然后就去思考递归。
发现,没有柱子的时候,过去的数量必然是y+1。
有一个柱子,就可以让这个y+1,先存到柱子上,然后再过去y+1,然后再让柱子上的过去。
有两个柱子,就可以先存y+1个,然后再存y+1个,然后我们将原来编号小的那一组y+1,放到编号大的上面。于是,又可以存一组y+1,这时候,还能跳过去y+1,再挨个释放。即4*y+1。
注:这里存以y+1为一组,是因为,小了很亏,大了,在进行组合并的时候,需要先释放在荷叶上,再堆叠。
最后,记录一下二分查找。
在有序数组里查找,跳出的条件是左 > 右。每次取中点与结果进行对比,大了在右区间搜(mid+1,R),小了在左区间搜(L,mid-1)。二分枚举的是结果本身。
SDUTOJ-3916-上色的纱雾,是求分成m段能得到的最小的最大区间长度。
这道题当时没想过贪心,不过后来做区间覆盖想过二分枚举=w=。但是,并不可行,因为区间覆盖,求的是最小的m段区间长度和。