动态规划是前一个状态推导过来的,贪心是局部最优解。
class Solution {
public:
int fib(int n) {
int a=0;
int b=1;
int res=0;
if(n==1) return 1;
for(int i=2;i<=n;i++){
res=a+b;
a=b;
b=res;
}
return res;
}
};
可以由前面状态推出后面状态,是动态规划。由于始终只要后面两个数,得出新的数。所以不需要数组保存,而是用O(1)的空间就可以了。
class Solution {
public:
int climbStairs(int n) {
vector<int> dp(n+1,0);
if(n<=2) return n;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++){
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
};
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
vector<int> dp(cost.size()+1,0);
cost.insert(cost.end(),0);
dp[0]=cost[0];
dp[1]=cost[1];
if(cost.size()==2){
return min(cost[0],cost[1]);
}
if(cost.size()==1) return cost[0];
for(int i=2;i<cost.size();i++){
dp[i]=min(dp[i-1],dp[i-2])+cost[i];
}
return dp[cost.size()-1];
}
};
我定义dp[i]为取当前代价条件下最小代价,为了能到顶部,所以cost后面加一个0,表示顶端。