Javascript 笛卡尔积服从约束的划分集
我正在阅读,其中描述了以下问题陈述: 您将获得两个整数:Javascript 笛卡尔积服从约束的划分集,javascript,algorithm,set,combinatorics,cartesian-product,Javascript,Algorithm,Set,Combinatorics,Cartesian Product,我正在阅读,其中描述了以下问题陈述: 您将获得两个整数:N和K。Lun狗对满足以下条件的字符串感兴趣: 字符串正好有N个字符,每个字符都是'A'或'B' 字符串s正好有K对(i,j)(0(这是一种算法构造所有解的方法;您可能正在寻找一种更数学的方法。) 在链接的问题中,我给出了一种寻找字典最小解的方法。这告诉你可以构造解的最小B数是多少。如果你把方法放在头上,从一个包含所有B的字符串开始,从左边加上a,你可以找到最多的B数这不是一个解决办法 < P >在这个范围内构造B个特定数量的所有解,你可
N
和K
。Lun狗对满足以下条件的字符串感兴趣:
- 字符串正好有
N个
字符,每个字符都是'A'或'B'
- 字符串
正好有s
对K
((i,j)
0(这是一种算法构造所有解的方法;您可能正在寻找一种更数学的方法。) 在链接的问题中,我给出了一种寻找字典最小解的方法。这告诉你可以构造解的最小B数是多少。如果你把方法放在头上,从一个包含所有B的字符串开始,从左边加上a,你可以找到最多的B数这不是一个解决办法 < P >在这个范围内构造B个特定数量的所有解,你可以再次使用递归方法,但不是只添加一个B并用N-1递归一次,你可以添加B,然后巴河,然后BAa……和递归的所有情况都将产生有效的解决方案。再次考虑n=13和k=29的例子,其中最小的NUBEB的r为3,最大值为10;您可以为例如4个B构建所有解决方案,如下所示:
(13,29,4)=N=13(位数) K=29(对数) B=4(B的数量)
此时,您知道您已经到达了生成解决方案的案例的末尾,因为(9/2)2<23。因此,在每个级别,您都会递归:(12,20,3)+“B” (11,21,3)+“BA” (10,22,3)+“BAA”
当您达到递归级别,其中B为1或N-1时,您可以构造字符串而无需进一步递归 实际上,您要做的是从尽可能向右的B开始,然后一个接一个地向左移动,同时通过向右移动其他B来进行补偿,直到达到B尽可能向左的位置。请参阅此代码段的输出:N=N-添加字符串的长度 K=K-仍需添加的A的数量 B=B-1
函数ABstring(N,K,B,str){ 如果((N-B)*B
=0;i--) str=(B==1&&i==K | | B==N-1&&N-1-i!=K | | B==N?):“A”)+str; 文件。写(str+“
”); }否则{ var prefix=“B”; --B; 而(--N){
如果(K-(N-B)>=0&&B让p是函数,对于给定的AB字符串,它返回好对的数目(i,j),s[i]=“A”,s[j]=“B”
首先考虑长度为<代码> n>代码>,其中“代码> b的< /代码>的数目是固定的,如<代码>(N-B) <代码> A的<代码> >调用该字符串<代码> Syb 。min p在代码> Syb 为0,左侧为<<代码> b <代码>(调用此字符串<代码> O< /代码>)
上的最大P为S_b
,所有b*(N-b)
都在右侧。这是一个简单的检查b
中是否存在S_b
,并具有所需属性 考虑交换相邻S
->BA
的操作。该操作将p更改为AB
。仅使用该操作,从字符串+1
开始,就可以用O
构造每个字符串。这就给出了ifb
比b*(N-b)>=K
中的s\u b
具有所需属性s
最右边的
在B
中可以移动到字符串的末尾,O
位置。由于无法交换两个N-B
,因此最右边B
左侧的B
可以移动到最右边的B
,移动次数B
(B
)can make ism
0@m69我不知道你是否真的读过这个问题,我特别链接到了这个问题。目标是更有效地解决一般情况下的组合问题,而不是解决字符串操作问题。这里给出的两个答案都不会计算所有可能的分区;它们计算一个人的单个分区内尔:这不容易概括。我看到了“这个问题”的链接,并假设这是一个指向另一个提问者看到问题所在的同一个站点的链接。很抱歉得出结论。只是一个非常笼统的想法:找到一些“算术中立”的链接对这些字符串的操作。例如,以13和29以及字符串1和4为例:将第二个a更改为b可以通过将位置5和7从b更改为a进行补偿。如果您可以找到a(部分)对所有等价字符串进行排序,并通过这种转换系统地遍历它,您只需找到最小字符串,然后从那里开始工作,而不必做所有“浪费”的事情步骤。我假设你可以将一个有一定数量的a和B的解决方案转换成每个有相同数量的a和B的解决方案,方法是向左移动一些B,然后向右移动另一个B进行补偿,只要它们不相互跳过。哪两个B向左和向右移动不是无关紧要的吗?在任何情况下,移动两个B的距离为1相反方向的ep导致Bs“交叉”,产生的字符串与前一个相同。
const test = ([l, r]) => cart(l, r).reduce((p, [li, ri]) => p + (li < ri ? 1 : 0), 0) === k const indices = _.range(0, n) const results = partitions(indices).filter(test)
"aababbbbbbbbb", "babaaabbbbbbb", "baabababbbbbb", "abbaababbbbbb", ...