zoukankan      html  css  js  c++  java
  • 70. Climbing Stairs QuestionEditorial Solution

    You are climbing a stair case. It takes n steps to reach to the top.

    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?


    DFS

    对于n = 3的情况:

    有3种途径

    (1, 1, 1)、(1, 2)、(2, 1)

    这里(1,2)与(2,1)是两种。

    #include <iostream>
    #include <set>
    #include <map>
    #include <vector>
    #include <sstream>
    #include <string>
    #include <algorithm>
    #include <bitset>
    using namespace std;
    
    class Solution {
    public:
    	void dfs(int n)
    	{
    		if (n < 0)
    		{
    			return;
    		}
    		else if(n == 0)
    		{
    			count++;
    		}
    		else
    		{
    			dfs(n - 1);
    			dfs(n - 2);
    		}
    	}
    
        int climbStairs(int n) {
            
        	if (m.count(n))
        	{
        		return m[n];
        	}
        	else
        	{
        		count = 0;
            	dfs(n);
            	m[n] = count;
            	return count;
        	}
        }
    private:
    	int count;
    	map<int, int>m;
    };
    
    int main()
    {
    	Solution s;
    	for (int i = 1; i <= 20; ++i)
    	{
    		cout << i << ":" << s. climbStairs(i) << endl;
    	}
    	return 0;
    }


    毫无疑问,超时了

    1:1
    2:2
    3:3
    4:5
    5:8
    6:13
    7:21
    8:34
    9:55
    10:89
    11:144
    12:233
    13:377
    14:610
    15:987
    16:1597
    17:2584
    18:4181
    19:6765
    20:10946
    [Finished in 2.0s]

    观察规律:

    X[i] = X[i - 1] + X[i - 2](i > 2)

    那么可以采用记忆化搜索,也就是将中间的结果保存下

    #include <iostream>
    #include <vector>
    #include <set>
    #include <algorithm>
    #include <string>
    #include <sstream>
    #include <cstring>
    using namespace std;
    
    class Solution {
    public:
        Solution()
        {
            memset(num, 0, sizeof(num));
            num[1] = 1;
            num[2] = 2;
        }
    
        int dfs(int n)
        {
            if (num[n] != 0)
            {
                return num[n];
            }
            return (num[n] = dfs(n - 1) + dfs(n - 2));
    
        }
    
        int climbStairs(int n) {
            if (num[n] == 0)
            {
                dfs(n);
            }
            return num[n];
        }
    private:
        int num[10000];
    };
    
    int main()
    {
    	Solution s;
        cout << s.climbStairs(44);
    	return 0;
    }




    Keep it simple!
    作者:N3verL4nd
    知识共享,欢迎转载。
  • 相关阅读:
    关于返回上一页功能
    Mybatis Update statement Date null
    SQLite reset password
    Bootstrap Validator使用特性,动态(Dynamic)添加的input的验证问题
    Eclipse使用Maven2的一次环境清理记录
    Server Tomcat v7.0 Server at localhost failed to start
    PowerShell一例
    Server Tomcat v7.0 Server at libra failed to start
    商标注册英语
    A glance for agile method
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616327.html
Copyright © 2011-2022 走看看