【发布时间】:2019-07-18 21:22:05
【问题描述】:
我在一次编程比赛中遇到了这个问题:
给定一个由 n 个元素组成的数组。在每次迭代中,您可以选择任意两个元素 ai 和 aj 并替换 ai 与 ai & aj。 & 是按位与运算符。 找出使所有数组元素为零所需的最小 AND 操作数。
假设给定输入有一个解决方案。这个问题的最优解是什么?
编辑: 我已经为运行时间超过 1 秒的问题添加了我的 DP 解决方案。有什么加快速度的建议吗?
0
D:以 2 为底的最大位数(0
目标:2^D - 1
T[i][X] => {n_0, n_1, ..., n_i} 中使 X 为零的最小元素数
T[i][0] = 0
T[0][X>0] = INF
T[i][X] = min( 1 + T[i-1][X & n_i] , T[i-1][X] )
T[n][GOAL] -> AND 操作的最小次数
【问题讨论】:
-
"假设有一个解,这个问题的最优解是什么?"解决方案不会仅仅因为您认为它存在而实现:) 无论如何,您尝试了什么?
-
你有什么想法?有什么线索吗?你用“动态编程”标记了这个问题,所以听起来你有一个想法。
-
问题的那一部分要在问题的上下文中理解。比如数组
{1,1}没有解,因为1 & 1 = 1,所以不能用上述操作清空数组。 -
似乎缺少信息。在不知道数组中的值的情况下,您无法判断两个元素是否会产生零。
-
这个编程竞赛还在进行吗?请发送一个链接。
标签: algorithm data-structures dynamic-programming greedy