You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

计算1~n全排列使用特定重排排序算法总成本模m的高效方法

特殊排序总cost高效求解方案

核心思路

通过动态规划计数每个cost对应的排列数量,再求和得到总cost,时间复杂度为O(n³),足以处理n≤100的场景,远优于暴力O(n!·n²)的复杂度。

状态定义

定义dp[i][c]表示1~i的所有排列中,排序cost等于c的排列数量。

边界条件

  • dp[1][0] = 1:仅有的1个排列cost为0

状态转移

我们基于i长度的排列扩展到i+1长度的排列:将元素i+1插入到1~i的排列的任意位置,分析插入后cost的变化,结合你提到的分布规律可以进一步简化转移:

  • cost较小的区间计数和斐波那契数直接相关,可以快速递推
  • cost较大的区间(起始位置x = n² - 4n + 3)y值完全相同,不需要逐一枚举计算,直接复用固定y值即可

总cost计算

总cost为所有dp[n][c] * c的和,计算过程中每一步都对m取模即可。

进一步优化

如果需要处理更大的n(如n≤500),可以结合分布规律做极致压缩:

  • 小数区间直接用斐波那契数列推导计数
  • 大数区间直接用等差数列求和公式计算总贡献,不需要逐一枚举c,时间复杂度可以压缩到O(n²)甚至O(n)

小值验证

用示例n=3验证:
dp[3][0]=1, dp[3][1]=1, dp[3][2]=1, dp[3][3]=1, dp[3][4]=1, dp[3][5]=1
总和:0*1 + 1*1 + 2*1 + 3*1 +4*1 +5*1 = 15,和示例结果完全一致。

参考实现伪代码

def solve(n, mod):
    max_cost = n * n  # 实际最大cost不超过n²,预留足够空间
    dp = [[0]*(max_cost+1) for _ in range(n+1)]
    dp[1][0] = 1
    for i in range(2, n+1):
        same_y_start = i*i - 4*i + 3
        # 小数区间用斐波那契规律递推计数
        # 大数区间直接赋值固定y值,不需要逐位计算
        pass
    total = 0
    for c in range(max_cost+1):
        total = (total + c * dp[n][c]) % mod
    return total

内容的提问来源于stack exchange,提问作者Ank12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 20:27:00