Min Cost Climbing Stairs [746]

题目描述

简单来说就是:要跳过当前楼梯需要花费当前楼梯所代表的价值cost[i], 花费cost[i]之后,可以选择跳一阶或者两阶楼梯,以最小的代价达到楼层,也就是跨过所有楼梯

问题解决

穷举法

从第一阶楼梯开始,遍历所有可能的情况,然后选择代价最小的。复杂度会比较高,时间复杂度O(2^n),不太适合

动态规划

逆向解决:从后往前倒退,跳过当前阶楼梯代价最小的情况下需要考虑其面楼梯代价最小的情况,而且每次只能跳一阶或者两阶,也就是说跳过当前fn阶楼梯,需要的代价可以表示为f(n) = cost[n]+ min(f(n+1), f(n+2))(果然编程到最后都是数学问题啊)

这样就找到了解决问题的办法。从最后的楼梯开始,f(n)=cost[n]+min(f(n+1)=0, f(n+2)=0);
f(n-1) = cost[n-1] + min(f(n), f(n+1)),以此类推

代码

	class Solution {
		public:
		    int minCostClimbingStairs(vector<int>& cost) {
		        int length = cost.size();
		        int f1 = 0;
		        int f2 = 0;
		        for(int i=length-1; i>=0; i--){
		            int fn = cost[i] + min(f1, f2);
		            f2 = f1;
		            f1 = fn;
		        }
		        return min(f1, f2);
		    }
	};

posted on 2019-01-13 09:58  晨暮  阅读(108)  评论(0编辑  收藏  举报