题目:
矮人们所生活的地区有 N 棵树。有趣的是,这 N 棵树排成了一条直线。现在,矮人们为了建造一个新的小屋,决定砍掉 K 棵树来获取木材。但是,矮人们希望对于任意两棵相邻的树,至少要保留一棵。矮人们想知道,他们有多少种不同的砍树方案。由于方案数可能很大,你只需要输出方案数除以 10007 的余数。
思路:
1.算法名称:递归。(由题目易得,插空问题答案为C(k,N-k+1),用递归优化组合数节省时间)
2.参变量意义:dp[x][y]表示x棵树中砍y棵树一共有多少种情况。
3.具体分析:假设此时有x棵树,分类讨论。
(1)若第x棵树砍了,则第x-1棵树不能砍,等价于前x-2棵树中砍了y-1棵,此时有dp[x-2][y-1]种情况。
(2)若第x棵树没砍,该条件下,x棵树中砍了y棵等价于x-1棵树中砍了y棵,此时有dp[x-1][y]种情况。
综上,dp[x][y]=dp[x-2][y-1]+dp[x-1][y]
代码展示: