和动态规划的第一次相遇
- 你是我生活中每一步怎么走的指导算法
- 数学上把你称之为丑陋的数学归纳法,即k<n-1&&k=n-1到k<=n的过程。
- 状态转移,重复子问题,最优子结构是你的核心。
- 你总是第一依赖暴力算法。
- 给普通人的感觉就像是列出一个算式,怎么把参数倒腾的一步步,然后在这个二元结果集中求最优解的办法。
- 备忘录是你最常用的利器,使用了它之后,你整个人都不一样了,时间复杂度可以达到O(n),明明是树,然而复杂度确那么低。
- 很多人对你有误解,认为你是递归,然而递归是一种没办法的遍历,你的状态转移需要一个小语义的安适。
- 你是自下而上的。自上而下告诉我们要从最高处暴力遍历。自下而上则是进行设计了一个结果,拿到了一个转移这个结果的方程,逐步从顶层向下进行转移。
经典问题,爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
/** * @param {number} n * @return {number} */ var climbStairs = function(n) { //明确dp数组,所谓dp,就是动态规划英文的缩写。 var dp=[] //明确dp数组的边界,即我们开始推演的起始点。 dp[1]=1; dp[2]=2; //特意定义的变量名称,叫做tz,即转移的意思。这里的tz指针代表了『状态』的转移。 var tz = 3;//从3开始是因为它只能爬1步,或2步。第三步就需要进行「计算」了。 //我要爬n阶,我只要状态转移到n就可以了。 while(tz<=n){ dp[tz]=dp[tz-1]+dp[tz-2]; //【🏁 状态转移方程】 tz++; } return dp[n]; //返回我要的结果 };
上一篇:
通过多线程提高代码的执行效率例子
下一篇:
JAVA进阶学习记录——3.接口和多态