629.k-inverse-pairs-array.go 843 B

1234567891011121314151617181920212223242526272829303132333435
  1. const MOD int = 1000000007
  2. func kInversePairs(n int, k int) int {
  3. if k < 0 || n*(n-1)/2 < k { // For n, n-1, ... , 2, 1, k = n*(n-1)/2 -> maximum
  4. return 0
  5. } else if k == 0 || k == n*(n-1)/2 {
  6. return 1
  7. }
  8. dp := make([][]int, n+1)
  9. for i := range dp {
  10. dp[i] = make([]int, k+1)
  11. }
  12. // dp[n][k] means kIP(n, k), so:
  13. // dp[n][k] = dp[n-1][k] + dp[n-1][k-1] + ... + dp[n-1][k-n+1]
  14. // dp[n][k+1] = dp[n-1][k+1] + dp[n-1][k] + ... + dp[n-1][k+1-n+1]
  15. // => dp[n][k+1] = dp[n][k] + dp[n-1][k+1] - dp[n-1][k-n+1]
  16. dp[2][0], dp[2][1] = 1, 1
  17. for i := 3; i <= n; i++ {
  18. dp[i][0] = 1
  19. for j := 1; j <= minInt(k, i*(i-1)/2); j++ {
  20. dp[i][j] = (dp[i][j-1] + dp[i-1][j]) % MOD
  21. if j >= i {
  22. dp[i][j] = (dp[i][j] + MOD - dp[i-1][j-i]) % MOD
  23. }
  24. }
  25. }
  26. return dp[n][k]
  27. }
  28. func minInt(x, y int) int {
  29. if x < y {
  30. return x
  31. }
  32. return y
  33. }