111爬楼梯
题目
http://www.lintcode.com/zh-cn/problem/climbing-stairs/#
假设你正在爬楼梯,需要n步你才能到达顶部。但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部?
样例
比如n=3,1+1+1=1+2=2+1=3,共有3种不同的方法
返回 3
思路
- 使用简单的动态规划思想:dp[i]=dp[i-1]+dp[i-2]
- dp[0]=0、dp[1]=1、dp[2]=2
- 后面当我们有三步时候,可以1,1,1和1,2和2,1即dp[3]=dp[1]+dp[2]=3
’
3
走2步 / \ 走一步
1 2
走1步 / 1步/ \2步
0 1 0
1步 /
0
方法:3条路线,其实就是步为1和2之和
5
走2步 / \ 走一步
3 4
1步/ \2步
3 2
方法:dp[5]=dp[4]+dp[3]
=dp[3]+dp[2]+dp[2]+dp[1]
=dp[2]+dp[1]+dp[2]+dp[2]+dp[1]
=2+1+2+2+1=8
代码
class Solution:
"""
@param n: An integer
@return: An integer
"""
def climbStairs(self, n):
# write your code here
if n<=2:return n
dp=[]
for _ in range(n+1):
dp.append(0)
dp[:3]=[0,1,2]
i=3
#开始递归
while i<=n:
dp[i]=dp[i-1]+dp[i-2]
i+=1
#最后一个为方法个数
return dp[-1]
110最小路径和
题目
http://www.lintcode.com/zh-cn/problem/minimum-path-sum/
给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。
注意事项
你在同一时间只能向下或者向右移动一步
思路
- 爬楼梯是一维数组,最小路径和算是二维数组的动态规划;dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
- dp[0][0]=grid[0][0]
代码
class Solution:
"""
@param: grid: a list of lists of integers
@return: An integer, minimizes the sum of all numbers along its path
"""
def minPathSum(self, grid):
# write your code here
#动态规划、m行n列
m=len(grid)
n=len(grid[0])
#新建一个m*n的数组,元素为0
dp=[[0 for _ in range(n)]for _ in range(m)]
dp[0][0]=grid[0][0]
for i in range(1,m):
dp[i][0]=grid[i][0]+dp[i-1][0]
for j in range(1,n):
dp[0][j]=grid[0][j]+dp[0][j-1]
for i in range(1,m):
for j in range(1,n):
dp[i][j]=self.min(dp[i-1][j],dp[i][j-1])+grid[i][j]
return dp[-1][-1]
def min(self,a,b):
if a>b:return b
return a