CCI 复习笔记 9

这篇博客主要介绍了递归与动态规划在解决算法问题中的应用,包括小孩跑楼梯、图的路径计算、数组中的特定元素、子集生成、字符串全排列、有效括号组合等问题。博主分享了各种问题的思路和Python实现,并提到了递归转动态规划的思考过程,以及使用cache优化搜索效率。
摘要由CSDN通过智能技术生成

临时抱佛脚啊,就先抱下这张

递归和动态规划可谓是难点,主要是思维。思维这个东西。。。貌似刷题确实可以弥补,可是我实在没空刷题。不说啥了,明天就又面谷歌了,抓紧吧


这次我保证基本每道题都用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值