Algorithm 找到许多方法来创建长度为n且满足m条件的序列

Algorithm 找到许多方法来创建长度为n且满足m条件的序列,algorithm,time-complexity,dynamic-programming,Algorithm,Time Complexity,Dynamic Programming,找到许多方法来创建长度为n且满足m条件的序列。此序列A应仅由非负数组成。每个条件由表示maxA[i],A[j]=k的三个整数i,j,k描述。保证序列的每个索引至少在一个条件下存在,即,此类序列的数量有限。 n的最大值不得超过18,k的最大值不得超过20000。 我尝试使用动态规划,但时间复杂度是指数级的。你能给我推荐一种更好的方法来降低时间复杂度吗?根据用户3386109的建议,将每个输入约束maxA[i],A[j]=k分解为三个约束: A[i]≤ K A[j]≤ K A[i]=k∨ A[j]=

找到许多方法来创建长度为n且满足m条件的序列。此序列A应仅由非负数组成。每个条件由表示maxA[i],A[j]=k的三个整数i,j,k描述。保证序列的每个索引至少在一个条件下存在,即,此类序列的数量有限。 n的最大值不得超过18,k的最大值不得超过20000。
我尝试使用动态规划,但时间复杂度是指数级的。你能给我推荐一种更好的方法来降低时间复杂度吗?

根据用户3386109的建议,将每个输入约束maxA[i],A[j]=k分解为三个约束:

A[i]≤ K A[j]≤ K A[i]=k∨ A[j]=k 我们可以使用类似DPLL的回溯过程计算解决方案。首先,单位传播的等价物:

给定两个约束条件A[i]≤ k1和A[i]≤ k2,我们可以保留一个[i]≤ 切碎1,k2并丢弃另一个。 给定两个约束A[i]=k1和A[i]≤ k2,如果k1,我们可以放弃后者≤ k2或声明没有其他解决方案。 给定两个约束条件A[i]≤ k1和A[i]=k2∨ A[j]=k2,如果k1 否则,存在约束a[i]=k∨ A[j]=k。我们进行两个递归调用:一个使用额外约束A[i]=k,另一个使用额外约束A[i]≤ 我们知道A[i]>k是不可能的


递归树的深度最多为n,因为在单元传播后,每个子调用修复的变量比其父调用修复的变量多。因此,搜索树有O2n个节点,每个节点都应该相当便宜。

根据用户3386109的建议,将每个输入约束maxA[i],A[j]=k分解为三个约束:

A[i]≤ K A[j]≤ K A[i]=k∨ A[j]=k 我们可以使用类似DPLL的回溯过程计算解决方案。首先,单位传播的等价物:

给定两个约束条件A[i]≤ k1和A[i]≤ k2,我们可以保留一个[i]≤ 切碎1,k2并丢弃另一个。 给定两个约束A[i]=k1和A[i]≤ k2,如果k1,我们可以放弃后者≤ k2或声明没有其他解决方案。 给定两个约束条件A[i]≤ k1和A[i]=k2∨ A[j]=k2,如果k1 否则,存在约束a[i]=k∨ A[j]=k。我们进行两个递归调用:一个使用额外约束A[i]=k,另一个使用额外约束A[i]≤ 我们知道A[i]>k是不可能的


递归树的深度最多为n,因为在单元传播后,每个子调用修复的变量比其父调用修复的变量多。因此,搜索树有O2n个节点,每个节点都应该相当便宜。

您知道问题的难点是什么吗?虽然这类问题通常不被认为是初学者/容易的问题,但如果不考虑太多,它可能类似于2SAT,也就是多时间。maxA[i],A[j]=k表示A[i]=k,A[j]这是作业还是比赛?有另一个人问了完全相同的问题。请披露来源。@justhalf这个问题也被张贴在上面,指出它是其中的一部分。@justhalf如果k是素数,那么LCMa,b=k等于条件maxa,b=k。我相信你可以将竞赛问题简化为假设B_I为素数的情况,然后给出当前的问题。你知道问题的难度是什么吗?虽然这类问题通常不被认为是初学者/容易的问题,但如果不考虑太多,它可能类似于2SAT,也就是多时间。maxA[i],A[j]=k表示A[i]=k,A[j]这是作业还是比赛?有另一个人问了完全相同的问题。请披露来源。@justhalf这个问题也被张贴在上面,指出它是其中的一部分。@justhalf如果k是素数,那么LCMa,b=k等于条件maxa,b=k。我相信你可以将竞赛问题简化为假设B_I为素数的情况,然后给出当前问题
在约束条件下,您不会放弃另一个节点,而是将另一个节点指定为极限。另外两个观察结果。我们可以通过使用条目作为节点来创建一个图,而将待满足的约束作为边来创建。这导致了两个好的捷径。1未连接的组件可以彼此单独求解,并将答案相乘。2始终选择连接到最多边的节点进行下一步猜测。在采用最小约束的情况下,不放弃另一个约束,而是指定另一个节点作为限制。另外两个观察结果。我们可以通过使用条目作为节点来创建一个图,而将待满足的约束作为边来创建。这导致了两个好的捷径。1未连接的组件可以彼此单独求解,并将答案相乘。2始终拾取连接到most边的节点以猜测下一个。