动态编程中初始化背后的直觉

时间:2017-11-03 15:36:54

标签: c++ dynamic-programming

我正在解决以下问题:

  

你正在爬楼梯。它需要n步才能达到顶峰。   每次你可以爬1或2步。您可以通过多少不同的方式登顶?

通过构建以下代码段:

class Solution {
public:
    int climbStairs(int n) {
        if(n==0)
            return 0;

        vector<int> dp(n+1);
        dp[0]=0;
        dp[1]=1;
        for(int i=2; i<=n; i++)
            dp[i] = dp[i-1] + dp[i-2];

        return dp[n];
    }
};

当我查看解决方案时,我发现他们进行了初始化:

dp[0]=0;
dp[1]=1;
dp[2]=2;            //--> Why?  And when to do this?

由于我初始化它的方式,我得到较低的值(例如n的答案是dp[n-1],依此类推)。所有这些,只是因为我没有初始化dp[2]=2。有人可以指出这个特定初始化背后的直觉吗?

谢谢!

注意:问题来自LeetCode.com

1 个答案:

答案 0 :(得分:1)

此处发布的代码不正确,这就是您没有看到dp [2] = 2的原因。

我相信这里的DP表是这样的,dp [k]表示使用此处描述的规则从步骤n-k爬到步骤n的方式的数量。因此,dp [0]应为1,而不是0.有一种方法可以通过遵循以下规则从步骤n进入步骤n:即,不要采取任何步骤!

一旦你正确地初始化了这个值,你就得到了dp [2] = dp [0] + dp [1] = 1 + 1 = 2.没有必要显式初始化dp [2],因为价值来自一般情况。