首页 > 其他分享 >关于子集问题的一种解法

关于子集问题的一种解法

时间:2022-08-17 15:12:45浏览次数:92  
标签:multi min int 复杂度 dat 子集 关于 maxN 解法

关于子集问题的一种解法

1.引入

给定 \(n\) 以及两个长度为 \(2^n\) 的序列 \(a\) 和 \(b\) ,对于每个 \(k\) 求
\(min_{i|j=k}{ \{a_i + b_j \} }\)。

对于这类不可逆的运算,常规的 \(FWT\) 无法解决,当然也可能是我太菜

而暴力枚举的复杂度为 \(2^{2n}\) 无法接受,

这时候我们就需要用到分治乘法。

2.记号

以下记号借用了集合幂级数的一些内容。

考虑将长度为 \(2^n\) 序列 \(a\) 中下标二进制最高位为 \(1\) 的部分记录为 \(a^+\) ,为 \(0\) 的部分记为 \(a^-\) ,记录答案序列为 \(f\) 。

首先,显然 \(f = f^+ + f^-\)。

并且,我们有

\(f^+ = min\{min(a^+ + b^-) , min(a^- + b^+ ) , min(a^+ + b^+)\}\),

\(f^- = a^- + b^-\)

注意到这时我们已经把问题分成四个长度为 \(2^{n-1}\) 的子问题,但是如果暴力分治求解复杂度还是 \(2^{2n}\) 并且还多了一堆常数

不过第一个式子可以做如下化简,

\(f^+ = min(min(a^+, a^-) + b^+, min(a^-+b^+))\)

而 \(min(a^+, a^-)\) 是可以在分治过程中处理的,

这是我们的分治过程为 \(T(2^n) = 3 T(2^{n-1}) + O(2^n)\)

由主定理知,该算法的复杂度为 \(\Theta(3^n)\)。

如果采用合适的实现,空间复杂度可以做到 \(O(2^n)\)。

3.程序实现

该方法实现实际上起来异常的简单。

int a[maxN], b[maxN], c[maxN];
int dat[maxN];
void multi(int *a, int *b, int *c, int n, int *dat) {
  // a,b为上文所定义,c为答案数组,dat为临时数组,用来保存a的内容,n为长度
  // 由于min运算的不可逆性质,必须开个数组记录原内容
	n >>= 1;
	if (!n) { c[0] = min(a[0] + b[0], c[0]); return; }
	multi(a, b, c, n, dat); 
	multi(a + n, b, c + n, n, dat);
	for (int i = 0; i < n; ++i) {
		dat[i] = a[i];
	  a[i] = min(a[i], a[i + n]);
	}
	multi(a, b + n, c + n, n, dat + n);
	for (int i = 0; i < n; ++i)
		a[i] = dat[i];
}

4.习题

FWT能做的它都能做。

貌似还没什么习题。

也许可以用 AT4168 做板子?

标签:multi,min,int,复杂度,dat,子集,关于,maxN,解法
From: https://www.cnblogs.com/LitDarkness/p/16595272.html

相关文章

  • 关于read指向缓冲区的理解
    read在linux原型定义如下: #include<unistd.h>ssize_tread(intfd,void*buf,size_tcount);关于buf,man手册解释如下:“read()attemptstoreaduptocountby......
  • 关于swack.cn站点关停的通知
    由于运营精力及成本问题,本人决定无限期关停swack.cn站的公网服务,包括但不限于swack.cn、www.swack.cn以及相关的文件下载地址。一直以来swack.cn站的试运营本着无......
  • 关于生命的本质 复制
    生命的本质就是复制。那么,生命1.0的生命(单细胞生命),是选择性复制,比如,下一代,就是单纯的复制一下自己。如果,当前自己产生了变异,那变异是怎么来的,选择当自己某方面,强,或者不强,......
  • ES 增删改(关于文档的操作)
    1、create新增记录1.1新增记录不指定id,让es自动生成POSTlogs/_doc{"Level":"Warn","Content":"111"}结果如下:{"_index":"logs","_id":"Hd5v......
  • 关于操作系统中的stack
    操作系统中的stack。从freertos的手册中可以看到每个任务都需要有一个stackspace。Autosar的操作系统中配置也有同样的定义。这样做的必要性因为是多任务。任何一个task......
  • 关于Angular 管道中异步数据处理的方式
    管道使用就不赘述了,不清楚可以参考官方文档;1.新建一个service文件并添加一个异步请求,记得引入Injectable:   2.新建一个管道pipe文件,自定义管道,根据需求变更返回内......
  • 关于递归
    解决递归问题的5个步骤:视频地址:https://www.bilibili.com/video/BV13h411t7nd?spm_id_from=333.337.search-card.all.click&vd_source=1ec33ee093bb10b996d2573550f4722e......
  • 洛谷P2622 关灯问题II引发的关于DP实现形式及后效性的思考
      动态规划要求已经求解的子问题不受后续阶段的影响,即无后效性。而在这种递推的实现方式中,后面枚举的状态可能更新前面已经枚举过的状态。也就是说,这种递推的实现方式是......
  • 关于Mybatis中if标签未生效问题
    今日索引今天需要更改以前写的功能,增加字段来当控制器判断是执行方案一还是方案二在前端增加传值时,纠结了是传Boolean还是整形还是字符串类型因为是复选框类型,所以默认......
  • leetcode698-划分为k个相等的子集
    划分为k个相等的子集回溯+剪枝首先先判断总和sum能否被整除。然后对数组排序,从后向前遍历。如果当前的值大于target,表明最大值已经超出范围,直接返回false如果当前的......