算法训练营day38_贪心算法(3.10)
509.斐波那契数
写过很多遍了,这次按照步骤系统分析一下;
- f(i):第i项的值;
- f(i)=f(i-1)+f(i-2);
- f(0)=0,f(1)=1;
- 正序遍历;
class Solution {
public:
int f[40];
int fib(int n) {
if(n==0) return 0;
if(n==1) return 1;
memset(f,0,sizeof f);
f[0]=0,f[1]=1;
for(int i=2;i<=n;i++){
f[i]=f[i-1]+f[i-2];
}
return f[n];
}
};
70.爬楼梯
- f(i):爬到i的方案数量;
- f(i)=f(i-1)+f(i-2);因为可以从i-1一步上来,可以从i-2一大步上来;
- f(0)=1,f(1)=1;呆着原地不动是一个方案,直接一步上1是个方案;
- 正序遍历;
class Solution {
public:
int f[50];
int climbStairs(int n) {
if(n==0) return 1;
if(n==1) return 1;
memset(f,0,sizeof f);
f[0]=1,f[1]=1;
for(int i=2;i<=n;i++){
f[i]=f[i-1]+f[i-2];
}
return f[n];
}
};
746.使用最小花费爬楼梯
周赛1358分,简单题;
刚开始没注意到可以从0或者1开始爬,没什么好的方法,分别求0跟1开始的状态;
- f(i):从0开始,爬到i的最低花费;
- f(i)=(f[i-1]+cost[i-1],f[i-2]+cost[i-2]);
- f(0)=0,f(1)=cost(0);
- 正序遍历;
g同理;
class Solution {
public:
int f[1001],g[1001];
int minCostClimbingStairs(vector<int>& cost) {
memset(f,0,sizeof f);
memset(g,0,sizeof g);
int n=cost.size();
f[0]=0,f[1]=cost[0];
for(int i=2;i<=n;i++){
f[i]=min(f[i-1]+cost[i-1],f[i-2]+cost[i-2]);
}
g[1]=0,g[2]=cost[1];
for(int i=3;i<=n;i++){
g[i]=min(g[i-1]+cost[i-1],g[i-2]+cost[i-2]);
}
return min(f[n],g[n]);
}
};