当前位置:   article > 正文

【算法】记忆化回溯+状态压缩+分治

记忆化回溯
// 优化四:指令集优化,让CPU使用POPCNT指令,从而加速__builtin_popcount
#pragma GCC target ("sse4.2")
__builtin_popcount(state) == sz;   该指令计算state中二进制1的个数
  • 1
  • 2
  • 3

5619. 最小不兼容性

给你一个整数数组 nums 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中,使得同一个子集里面没有两个相同的元素。
一个子集的 不兼容性 是该子集里面最大值和最小值的差。
请你返回将数组分成 k 个子集后,各子集 不兼容性 的 和 的 最小值 ,如果无法分成分成 k 个子集,返回 -1 。
子集的定义是数组中一些数字的集合,对数字顺序没有要求。

  • 1 <= k <= nums.length <= 16
  • nums.length 能被 k 整除。
  • 1 <= nums[i] <= nums.length

思路

  • N有限定范围,即 N ∈ [ 1 , 16 ] N \in [1,16] N[1,16],显然可以使用状态压缩来表示数组所有的子集(状态),总状态数为 2 N 2^N 2N.递归求解每个状态数所对应的最小不兼容性,最后可得总集即状态数为 2 N − 1 2^N-1 2N1状态数的最小不兼容性。

在枚举分组方案时,若朴素的递归 [ 1... s t a t e ] [1...state] [1...state],总复杂度

  • 采用分治,即 r e t ( n u m s ) = m i n ( ( r e t ( l e f t 1 ) + r e t ( r i g h t
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/1003336
推荐阅读
相关标签
  

闽ICP备14008679号