问题:共n层台阶,每次只能上1级或者2级,问有多少种上台阶的方法。
首先分析一下题目,一般这种问题我都会先找一下规模最小的数值来分析一下,可以看到,上一层的走法是1种(1),上2层的走法是2种(11, 2),三层有3种(12, 21, 111),四层有5种(1111, 22, 211, 121, 112)……偷偷发现好像是斐波那契序列。。那要怎么样证明后边的数呢?
不清楚,那就设个x呗。设x为走到第n层的走法总和。可以这样想,我差一步就要到第n层了,那我就一定是在 n-1 或者 n-2 那里,设 走到 n-1 的走法和为 x1, 走到 n - 2的走法和为 x2, 那x = x1 + x2。
x1和x2称为问题的子结构,最终问题的解一定是根据他的子结构来解的。
最终的子结构是n = 1 和 n = 2的解,跟据这两个解可以推出最终解。
小解法:
class Solution {
public:
int jumpFloor(int number) {
if(number == 1)
return 1;
if(number == 2)
return 2;
int fir = 1, sec = 2;
int sum;
for(int i = 2; i < number; i++)
{
sum = 0;
sum += fir + sec;
fir = sec;
sec = sum;
}
return sum;
}
};
动态规划的经典是背包问题,上边这个算是最基础的动态规划。
动态规划的理论推导可以上wiki看:
https://en.wikipedia.org/wiki/Dynamic_programming