📌  相关文章
📜  从 1 到 N 没有相邻元素的整数子集的计数(1)

📅  最后修改于: 2023-12-03 15:36:12.819000             🧑  作者: Mango

从 1 到 N 没有相邻元素的整数子集的计数

问题描述

给定正整数 N,求由 1 到 N 中的整数组成的子集中,满足任意两个相邻的元素都不出现在同一个子集中的子集数目。

解法思路

我们设一个长度为 N 的 bool 型数组 dp,表示是否包含第 i 个数字。

对于第 i 个数字来说,有两种情况。如果它在子集中,那么 i-1 必须不在子集中,所以此时状态转移为:

$$dp_{i}=dp_{i-2}+dp_{i-3}$$

如果它不在子集中,那么此时状态转移为:

$$dp_{i}=dp_{i-1}$$

因此,最终答案就是 dp[N]。

代码实现
def count_subsets(N: int) -> int:
    if N == 1:
        return 2
    dp = [0] * (N + 1)
    dp[1] = 2
    dp[2] = 3
    for i in range(3, N + 1):
        dp[i] = dp[i - 1] + dp[i - 2]
    return dp[N]
复杂度分析

时间复杂度:$O(N)$

空间复杂度:$O(N)$