defsolve(): n, m = list(map(int, input().split())) a = list(map(int, input().split())) i, pre = 0, 0 while i < m: if a[i] != pre+1: for k inrange(pre+1, a[i]): print(k, end=' ') pre = a[i]-1 for k inrange(i, m): if a[k] == pre+1: pre += 1 else: break for j inrange(pre+1, a[i]-1, -1): print(j, end=' ') pre += 1 i = k if a[k]+1 == pre: break for i inrange(pre+1, n+1): print(i, end=' ')
defsolve(): n, m = list(map(int, input().split())) s = [] for i inrange(m): tp = input() s.append(set(list(map(int, input().split())))) ans = 0 for i inrange(1, (1<<m)): cur = set() for j inrange(m): if (i >> j & 1) : cur |= s[j] iflen(cur) == n: ans += 1 print(ans)
走楼梯,某些阶梯不能踩。每一步可以选择n种步长向上走。并且有 m
个障碍,走的过程中不能经过这些层。
问能不能从第 0 层走到第 x 层。
思路
爬楼梯,经典dp问题。只不过多了一些选择和限制。
时间复杂度:O(nx)
空间复杂度:O(x)
代码
1 2 3 4 5 6 7 8 9 10 11 12
defsolve(): n = int(input()) a = list(map(int, input().split())) m = int(input()) b = set(list(map(int, input().split()))) x = int(input()) dp = [False]*(x+1) dp[0] = True for i inrange(1, x+1): for j inrange(n): if i notin b and i >= a[j]: dp[i] |= dp[i-a[j]] print('Yes'if dp[x] else'No')