📅  最后修改于: 2023-12-03 15:36:12.819000             🧑  作者: Mango
给定正整数 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)$