0
点赞
收藏
分享

微信扫一扫

C++ 程序设计:用地毯覆盖后的最少白色砖块(LeetCode:2209)

玉字璧 2022-03-26 阅读 22

给你一个下标从 0 开始的 二进制 字符串 floor ,它表示地板上砖块的颜色。

floor[i] = '0' 表示地板上第 i 块砖块的颜色是 黑色 。
floor[i] = '1' 表示地板上第 i 块砖块的颜色是 白色 。
同时给你 numCarpets 和 carpetLen 。你有 numCarpets 条 黑色 的地毯,每一条 黑色 的地毯长度都为 carpetLen 块砖块。请你使用这些地毯去覆盖砖块,使得未被覆盖的剩余 白色 砖块的数目 最小 。地毯相互之间可以覆盖。

请你返回没被覆盖的白色砖块的 最少 数目。

示例 1:

输入:floor = "10110101", numCarpets = 2, carpetLen = 2
输出:2
解释:
上图展示了剩余 2 块白色砖块的方案。
没有其他方案可以使未被覆盖的白色砖块少于 2 块。
示例 2:

输入:floor = "11111", numCarpets = 2, carpetLen = 3
输出:0
解释:
上图展示了所有白色砖块都被覆盖的一种方案。
注意,地毯相互之间可以覆盖。
 

提示:

1 <= carpetLen <= floor.length <= 1000
floor[i] 要么是 '0' ,要么是 '1' 。
1 <= numCarpets <= 1000

思路:经典动态规划题。需要记录放置黑毯子的位置和数量,因此需要二维动态规划。我们定义dp[i][j]表示到第j个位置时用了i个毯子后剩余的白色砖块的最小数量。其中第j个位置上存在放与不放两种情况,取最小值即可。

class Solution {
public:
    int dp[1005][1005];
    int minimumWhiteTiles(string floor, int numCarpets, int carpetLen) {
        int n = floor.length();
        if (floor[0] == '1') dp[0][0] = 1;
        for (int i = 1; i < n; i++)
            dp[0][i] = dp[0][i - 1] + (floor[i] == '1' ? 1 : 0);
        for (int i = 1; i <= numCarpets; i++)
            for (int j = carpetLen; j < n; j++)
                dp[i][j] = min(dp[i][j - 1] + (floor[j] == '1' ? 1 : 0), dp[i - 1][j - carpetLen]);
        return dp[numCarpets][n - 1];
    }
};
举报

相关推荐

0 条评论