问题:我们有一个大小数组,n
我们最多可以执行K
每个操作可以执行的操作
- 将反转次数减少 1。
- 对整个数组进行随机洗牌。
我的问题是以K
这样一种方式执行操作,以使最终数组中的预期反转次数最小化。
约束:
100 个测试用例,
1 < n < 100
1 < K < n(n-1)/2
我的方法:我正在考虑动态编程解决方案。我可以使用马洪数计算e
在大小数组中精确反转的概率。我还逐行n
填充数组,表示在执行操作后数组中具有反转的最小预期反转,然后使用它我可以为数组中所有可能的反转生成最小预期值。dp[k+1][1+n(n-1)/2]
dp[i][j]
j
i
(i+1)<sup>th</sup>
由于 c++ 中双精度数的限制,这种方法的问题是概率不准确,并且该算法O(kn<sup>2</sup>)
适用于每个非常慢的测试用例。
例如:在大小为 100 = ~
的数组中没有反转的概率(我认为这里缺乏精度)。1.0/factorial(100)
10<sup>-160</sup>
我认为有一些准确和更有效的方法。请提出一些想法。
谢谢