思来想去,先刷动态规划吧.因为贪心算法的每个题目都有动态规划的算法.所以打算先刷动态规划,然后把贪心算法再来用动态规划算一次
70. 爬楼梯
class Solution {
public:
int climbStairs(int n) {
if(n<=2) return n;
int dp[3];
dp[1] = 1;
dp[2] = 2;
int sum = 0;
for(int i = 3; i <= n; i++){
sum = dp[1] + dp[2];
dp[1] = dp[2];
dp[2] = sum;
}
return sum;
}
};
509. 斐波那契数
class Solution {
public:
int fib(int n) {
if(n==0) return 0;
if(n==1) return 1;
return fib(n-1)+fib(n-2);
}
};
746. 使用最小花费爬楼梯
这道题目刚开始还是看不懂啊,最后题解中有一个哥们解释了一下,我感觉还是非常合理的
我觉得这个题的描述应该改改:每个阶梯都有一定数量坨屎,一次只能跨一个或者两个阶梯,走到一个阶梯就要吃光上面的屎,问怎么走才能吃最少的屎?开局你选前两个阶梯的其中一个作为开头点,并吃光该阶梯的屎
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int sum = 0;
//清楚dp数组的含义,dp[i]表示到第i层所需要的最少体力,可以从d[i-1],d[i-2]得来
//要清楚,d[i-1]和d[i-2]的最小值
//dp数组的初始化可以初始换前两个
vector<int> dp(cost.size()+1,0);
dp[0] = cost[0];//下标为0的台阶初始化
dp[1] = cost[1];//下标为1的台阶初始化
for(int i = 2; i < cost.size(); i++){
dp[i] = min(dp[i-1], dp[i-2])+cost[i];//因为上到第n个台阶还要花钱
}
return min(dp[cost.size()-2],dp[cost.size()-1]);
}
};
之前还不能理解用例中的例子,这是因为题目中,最后一层的上面还有一层。是一层没有屎吃的平台