今天偶然看到之前的climb stair题,这种迭代方法居然是DP,有点吃惊,类似这种从小问题,到大一点问题递推过去的递推方程确实是DP,但是子问题之间的独立性确实有点怀疑,因为一个问题分成的几个子问题要独立,例如矩阵链,两个必定独立,装配汽车,只有一个问题,不需要考虑,等等
而且还看到了好多个版本的代码,实在是大快人心,居然有用3个变量的vector来做,虽然和三个变量没本质区别,但是说明自己想的确实还是少,或许以后有的问题可能可以尝试这个路子
http://blog.youkuaiyun.com/kenden23/article/details/17377869
- int climbStairsRecur(int n) {
- if (n == 1) return 1;
- if (n == 2) return 2;
- return climbStairsRecur(n-1) + climbStairsRecur(n-2);
- }
- int climbStairs(int n)
- {
- vector<int> res(n+1);
- res[0] = 1;
- res[1] = 1;
- for (int i = 2; i <= n; i++)
- {
- res[i] = res[i-1] + res[i-2];
- }
- return res[n];
- }
- int climbStairs2(int n)
- {
- vector<int> res(3);
- res[0] = 1;
- res[1] = 1;
- for (int i = 2; i <= n; i++)
- {
- res[i%3] = res[(i-1)%3] + res[(i-2)%3];
- }
- return res[n%3];
- }
- //2014-2-10 update
- int climbStairs(int n)
- {
- if (n < 4) return n;
- int a = 2, b = 3, c = 5;
- for (int i = 5; i <= n; i++)
- {
- a = c;
- c = b+c;
- b = a;
- }
- return c;
- }
另外之前还看到编程之美里fibonacci数居然还有O(logn) 的算法(我三关尽毁==!),以及O(1) 好吧带入公式如果不叫算法的话,像我这种更喜欢当解数学题的人估计一开始就想着人脑求出通项来,直接带入,如果有无理数的话用round(),j应该是可以保证结果正确性的