class Solution {
public:
int securityCheck(vector<int>& capacities, int k) {
}
};
LCP 47. 入场安检
「力扣挑战赛」 的入场仪式马上就要开始了,由于安保工作的需要,设置了可容纳人数总和为 M
的 N
个安检室,capacities[i]
记录第 i
个安检室可容纳人数。安检室拥有两种类型:
恰好 M+1
位入场的观众(编号从 0 开始)需要排队依次入场安检, 入场安检的规则如下:
0
的安检室i
的安检室时(0 <= i < N
),i
的安检室时 (0 <= i < N-1
),将进入编号 i+1
的安检室接受安检。若可以任意设定每个安检室的类型,请问有多少种设定安检室类型的方案可以使得编号 k
的观众第一个通过最后一个安检室入场。
注意:
1000000007
取模后返回。示例 1:
输入:
capacities = [2,2,3], k = 2
输出:
2
解释: 存在两种设定的2
种方案:
- 方案 1:将编号为
0
、1
的实验室设置为 后进先出 的类型,编号为2
的实验室设置为 先进先出 的类型;- 方案 2:将编号为
0
、1
的实验室设置为 先进先出 的类型,编号为2
的实验室设置为 后进先出 的类型。以下是方案 1 的示意图:
示例 2:
输入:
capacities = [3,3], k = 3
输出:
0
示例 3:
输入:
capacities = [4,3,2,2], k = 6
输出:
2
提示:
1 <= capacities.length <= 200
1 <= capacities[i] <= 200
0 <= k <= sum(capacities)
原站题解
python3 解法, 执行用时: 2152 ms, 内存消耗: 21 MB, 提交时间: 2023-09-04 10:21:17
class Solution: def securityCheck(self, cap: List[int], k: int) -> int: c = Counter([0]) for x in cap: for s, v in [*c.items()]: c[s + x - 1] += v return c[k] % 1000000007
java 解法, 执行用时: 39 ms, 内存消耗: 39.3 MB, 提交时间: 2023-09-04 10:19:58
class Solution { public int securityCheck(int[] capacities, int k) { final int MOD = 1000000007; int[] dp = new int[k + 1]; dp[0] = 1; for(int c : capacities){ for(int j = k; j >= c - 1; j--){ dp[j] = (dp[j] + dp[j - c + 1]) % MOD; } } return dp[k]; } }
golang 解法, 执行用时: 32 ms, 内存消耗: 3.1 MB, 提交时间: 2023-09-04 10:19:14
// 转换成01背包问题 func securityCheck(capacities []int, k int) int { dp := make([]int, k+1) dp[0] = 1 for _, x := range capacities { x-- for s := k; s >= x; s-- { dp[s] = (dp[s] + dp[s-x]) % (1e9 + 7) } } return dp[k] }