列表

详情


LCP 47. 入场安检

「力扣挑战赛」 的入场仪式马上就要开始了,由于安保工作的需要,设置了可容纳人数总和为 MN 个安检室,capacities[i] 记录第 i 个安检室可容纳人数。安检室拥有两种类型:

c24754f1a5ff56989340ba5004dc5eda.gif

恰好 M+1 位入场的观众(编号从 0 开始)需要排队依次入场安检, 入场安检的规则如下:

若可以任意设定每个安检室的类型,请问有多少种设定安检室类型的方案可以使得编号 k 的观众第一个通过最后一个安检室入场。

注意:

示例 1:

输入:capacities = [2,2,3], k = 2

输出:2 解释: 存在两种设定的 2 种方案:

以下是方案 1 的示意图: c60e38199a225ad62f13b954872edf9b.gif

示例 2:

输入:capacities = [3,3], k = 3

输出:0

示例 3:

输入:capacities = [4,3,2,2], k = 6

输出:2

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int securityCheck(vector<int>& capacities, int k) { } };

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]
}

上一题