目录
[1. LeetCode746. 使用最小花费爬楼梯](#1. LeetCode746. 使用最小花费爬楼梯)
[2. LeetCode91. 解码方法](#2. LeetCode91. 解码方法)
今天我们继续来聊一聊动态规划的斐波那契数列类型的题目
1. LeetCode746. 使用最小花费爬楼梯
这个题目的话也是比较简单的。就是要求我们计算在可以一次走一步或者两步的情况下,到达结尾时的最小消耗。

所以在这道题里面它的状态表示就是走到当前位置的值的最小消耗。
所以在这道题里面它的状态转移方程就是dp[i]=min(dp[i-1],dp[i-2])+c[i]。
它的初始化就是第0个位子设置为c[0],第一个位置设置为c[1]。(怎么设置是因为我们是不知道开始的那个位置的大小,而且因为我们的状态转移方程需要依靠前两个位置的值,所以我们在这里就直接初始化前两个)。
填表顺序就是从前往后就好。
返回值就是dp表第sz-1个位置的值和第sz-2个位置的值的最小值。
cpp
class Solution {
public:
int minCostClimbingStairs(vector<int>& c) {
int sz=c.size();
vector<int> dp(sz+1);
dp[0]=c[0];
dp[1]=c[1];
for(int i=2;i<sz;++i)
{
dp[i]=min(dp[i-1],dp[i-2])+c[i];
}
return min(dp[sz-1],dp[sz-2]);
}
};
2. LeetCode91. 解码方法
这道题的话就是说,现在给一个数组,然后不同的数字可以代表不同的字母,可以单个字母,也可以两个字母拼在一起,然后要求我们返回这个数组可以组成的不同的字母串的数量。
这道题的话不难,就是多了一些细节上的判断。

在这道题里面它的状态表示就是以当前位置为结尾的字母串数量的最大值。
在这道题里面它的状态转移方程就需要分条件来判断了,如果当前位置不为0的话,那么就先dp[i]+=dp[i-1],然后如果可以和前面一个数字组成大于9并且小于27的数的话,那么dp[i]再+=dp[i-2]。(这边之所以需要判断两遍是因为当前位置为结尾和当前数加上前一个数一起作为结尾,所以需要计算两遍)
]它的初始化就是通过判断的方式来先初始化前面两个数。
填表顺序就是从前往后就好。
返回值就是dp表第sz-1个位置的值就好。(因为必须是所有数字全部用上)
cpp
class Solution {
public:
int numDecodings(string s) {
int sz=s.size();
vector<int> dp(sz);
if(s[0]!='0')
dp[0]=1;
else
return 0;
if(sz==1)
return 1;
if(s[1]!='0')
dp[1]+=dp[0];
if((s[0]-'0')*10+s[1]-'0'<27)
dp[1]++;
for(int i=2;i<sz;++i)
{
if(s[i]!='0')
dp[i]+=dp[i-1];
if(((s[i-1]-'0')*10+s[i]-'0')<27&&((s[i-1]-'0')*10+s[i]-'0')>9)
dp[i]+=dp[i-2];
}
return dp[sz-1];
}
};