临时抱佛脚啊,就先抱下这张
递归和动态规划可谓是难点,主要是思维。思维这个东西。。。貌似刷题确实可以弥补,可是我实在没空刷题。不说啥了,明天就又面谷歌了,抓紧吧
这次我保证基本每道题都用python写一下。
9.1 小孩跑楼梯,可以一步可以两步可以三步。
这个很简单,类似的题还有什么几个硬币加起来等于多少之类的。代码不放了,太花眼,总之recursion出来的是3^N, 太慢,可以做一个一维的map。记录对于某一个值,有多少种,map(n)=map(n-1)+map(n-2)+map(n-3), 注意是边界条件,map(0)=1。书上给的那个DP解法,比较符合从递归转到动态规划的思想,但是貌似更加不容易懂
9.2 从一个图的一个顶点有多少种可能走到对角,如果有不能走的点怎么办?计算path,以及得到一条路径
map[i,j]=map[i-1,j]+map[i,j-1], 或者数学上可以算出来,C(n,X)。有不能走的点的情况似乎并没有什么区别。检查一下就可以,得到一条路径这个,用DP反而比较麻烦,比较适合用递归。
书上给的方法是对于一个点,如果存在从起点到我这里的路径,就加进来。因为到了树的最底层就是终点,所以终点先加进来,之后再是能够到终点的某个点,这个可以很安全地append path,因为append出线的前提就是x,y 到起点有一条路径,否则根本就到不了那里。这个地方思考有点难。
另外就是用了cache来消除搜索时候的重复。这个也有一个比较难的地方,就是cache return之后为什么就不用append到path里面去了。愿意其实是,这个算法作为DFS,根本只会找到第一个通道,所以所有True的node必然是第一次touch。
贴个代码
if(cache.has_key((x,y))):
return cache[(x,y)]
#It is impossible if we have a true cache element that has not been used in the solution
if((x==0 and y==0) or Get_One_Path(x-1,y,rock,cache,solution) or Get_One_Path(x,y-1,rock,cache,solution) ):
solution.append((x,y))
cache[(x,y)]=True
return True
else:
cache[(x,y)]=False
return Fa