【问题标题】:Intuition behind this initialization in Dynamic Programming动态编程中这种初始化背后的直觉
【发布时间】:2017-11-03 15:36:53
【问题描述】:

我正在解决以下问题:

你正在爬楼梯。到达顶部需要 n 步。 每次您可以爬 1 或 2 级台阶。您可以通过多少种不同的方式登顶?

通过构造如下代码sn-p:

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

【问题讨论】:

  • 顺便说一句:我在 LeetCode 上看到了很多很好的教程,但也看到了很多写得很糟糕的代码或糟糕的例子。对你在那里发现的东西持怀疑态度是有益的。
  • 这是斐波那契,不是吗?

标签: c++ dynamic-programming


【解决方案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],因为值来自一般情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-12
    • 1970-01-01
    相关资源
    最近更新 更多