
状态压缩
abant2
世界上最菜的arcem
展开
-
leetcode 1931 二维涂色问题 降维dp解法+状态压缩
题目的话,就是咱们高中经常做的涂色问题,一共三种颜色。最直观的感觉:不就是dp吗,考虑左边和上面的元素不就行了。但这样完全是不行的,2*2的我还能做,但是3*3除了枚举我已经无法得出正确答案了。这个题正确的做法是降维,因为有一个维度题目给的数据范围是 <= 5的,就针对这个处理。我们考虑一整行的状态转移,对于维度m,一行的可能性一共有3∗2m3*2^m3∗2m种。对每一行,我们可以用一个数字来存,因为只有5位,用10进制状态压缩即可。判断是否可转移,我们只需要判断每一位是否相等,都不相等说明可.原创 2021-07-11 18:04:28 · 454 阅读 · 3 评论 -
leetcode 1915 前缀和历史+状态压缩+异或
这个题一看就属于完全没法做的题,但经过状态压缩后,居然是前缀和历史,醉了。。此题的核心在于建模,如果我们有两个前缀和,能否通过类似减法得到相减后的表示?答案是可以的,定义每个串的状态为10位,1表示这个字母是奇数次,0表示这个字母是偶数次。所以0肯定是满足条件的。如果想合并两个前缀和,只需要用异或即可。这样前面的次数就会被低效。做法:边求前缀和边存历史,和leetcode 560类似。但此题还有一个额外条件,即允许有一个奇数次的。我们只需对每一位进行异或枚举,然后看是否在历史里即可。typedef .原创 2021-07-08 22:19:15 · 252 阅读 · 0 评论 -
leetcode 49 哈希+字典+质数
解法一:容易想到用Counter计数然后作为key放进字典,但字典不能被hash,所以只能用桶再转tuple,代码如下:class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: d = {} for s in strs: bm = [0 for _ in range(26)] for c in s:原创 2020-12-14 09:26:35 · 128 阅读 · 0 评论 -
leetcode 1178 子集+状态压缩
这个题是比较难的一个题,每批输入给的单词数和谜题数都很多,O(N2N^2N2)是行不通的。由于题目中要求单词中字母的多样性要少于谜题,即匹配代表着单词中的字母在谜题中都出现。所以我们预存所有单词的表示到哈希表中,同时计算谜题的所有子集(谜题长度最多7位)。这样查找谜题,就会变快。这里有两个难点,一个是字母的表示,由于每个字母最多一次,不需要用质数,这里用bitmap即可。第二个是子集的获取,可以用递归的算法一行得出,这个也是很妙的地方。from collections import defaultdic原创 2021-02-26 13:31:12 · 194 阅读 · 0 评论