问题在于:
给出一个以正整数n作为输入的算法,并计算可能的排序数 关系下的n个对象<和=。例如,如果n = 3,则13种可能的排序如下:
a = b = c,
a = b < c,
a < b = c,
a < b < c,
a < c < b,
a = c < b,
b < a = c,
b < a < c,
b < c < a,
b = c < a,
c < a = b,
c < a < b,
c < b < a.
您的算法应该在n。
中以时间多项式运行我对此问题无效。你能找到解决这个动态规划问题的方法吗?
答案 0 :(得分:3)
如果您只有&lt;,则可以订购一组N尺寸N!不同的方式。
如果你重新加入=,那么你可以将集合的分区计算为不同数量的等价类 - 并乘以排序方式的数量。
例如,让我们做一组3号大小(就像你的例子)。我们可以有1,2或3个等价类。只有一种方法可以有1个等价类,3种方法有2个等价类,1种方法有3个等价类(后面有关如何计算这些等等)。这给了1 * 1! + 3 * 2! + 1 * 3! =总排名13。
这将原始问题分解为更简单的问题:计算将集合划分为k个部分的方法。如果您编写函数S(N,k)来执行此操作,则可以通过计算得到原始问题的答案:
sum(k! * S(N, k) for k in 1, 2, ..., N).
您可以使用这些重复关系来计算分区(请参阅http://en.wikipedia.org/wiki/Stirling_number_of_the_second_kind):
S(N, k) = S(N - 1, k - 1) + k * S(N - 1, k)
S(N, 1) = 1
S(N, N) = 1
您可以使用动态编程来计算此功能。
答案 1 :(得分:3)
设f(n,k)是具有k个不等式关系(和(n - 1 - k)质量关系)的可能排序的数量。
很容易看出,f(n,0)= 1,f(n,n-1)= n!任何n。
现在我们要为任何k计算f(n,k)。想象一下,你移走了一个数字(任意),所以现在有(n-1)个数字。有两种可能性:
1)那些(n-1)个数中存在(k-1)个不等式,并且有(k + 1)(f(n-1,k-1)个)方法来添加第n个数,所以新的不平等增加了。
2)那些(n-1)个数中存在k个不等式,并且存在(k + 1)(f(n-1,k))个方法 添加第n个数字,没有额外的不等式。
所以,f(n,k)=(k + 1)(f(n-1,k-1)+ f(n-1,k))。
最终答案F(n)= f(n,0)+ f(n,1)+ ... + f(n,n-1)。
答案 2 :(得分:1)
你可以有这个递归函数:
F(1) = 1;
F(2) = 3;
F(n) = F(n-1) * n + F(n-2) * n*(n-1)/2 + F(n-3) * n*(n-1)(n-2)/3!+.... + F(1) * n + 1;
例如
F(2) = 1 * 2 +1 = 3;
F(3) = F(2) * 3 + F(1) * 3 + 1 = 9 + 3 + 1 = 13;
为什么?
认为你知道F(n-1)
现在你想要在你的序列中插入An
,An可以在序列中的0,1,2,... n位置,无论如何计算数字序列:
[A0,...An-1] < An this can be as [A0,...An] < An-1,...
所以有n * f(n-1)
个序列以<
how many sequences end with one `=` sign? f(n-2) * n * (n-1)/ 2 why? ... (think yourself it's easy)
how many sequences end with "K" "=" sing? f(n-k+1) * n * ...*(n-k+1)/ k!
并且有一个序列已满=
这可以简单地以多项式计算。