【动态规划问题】:
主要是找到第i个状态时候的通解,例如台阶问题,第i个状态的值F(i)仅与其前一步F(i-1)或两步状态F(i-2)(每次只能爬1-2个台阶,即状态变化补步长)有关,即F(i)=M(F(i-2),F(i-1)),其中M(x)为前一两个状态的函数计算(比如可以为+,-,x,/,或者Max,Min等)
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n=len(cost)
if n==0:
return 0
if n==1:
return cost[0]
F=0#初始化上一步爬到顶层的费用
for i in range(2,n):
c= F + min(cost[i-1],cost[i])
F= c
return F
最小花费爬楼梯:
通解:F为总体爬楼梯的花费,则F(n)=Min(F(n-2)+cost(n-2),F(n-1)+cost(n-1))
*本题有个较难理解的容易出错的地方,即F(0)=0,F(1)=0,也就是说,可以任意从第0阶梯或者第1阶梯爬起,登上第0或者第1阶梯的费用为0
*还有一个坑,就是n和n+1【所以这个破题到底什么乱七八糟的描述】,楼顶是n+1,所以要用到cost[n]
通解找到了,剩下的值依次可以通过递归求得了,代码如下:
class Solution:
def minCostClimbingStairs(self, cost: List[int]) -> int:
n=len(cost)
if n<=1:
return 0
F=[0]*(n+1)
#爬到0层或者1层的费用都为0,即可以从第0阶或者第1阶免费开始爬起
#F[0]=0
#F[1]=0
for i in range(2,n+1):
F[i] = min(F[i-2]+cost[i-2],F[i-1]+cost[i-1])
return F[n]