我正在解决以下问题:
你正在爬楼梯。它需要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。
答案 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],因为价值来自一般情况。