• 给定一个整数N,代表你有1~N这些数字。在给定一个整数K。你可以随意排列这些数字,但是每一种排列都有若干个逆序对。返回有多少种排列,正好有K个逆序对。


    问题描述:

            给定一个整数N,代表你有1~N这些数字。在给定一个整数K。你可以随意排列这些数字,但是每一种排列都有若干个逆序对。返回有多少种排列,正好有K个逆序对。

    例子1:
            Input: n = 3, k = 0
            Output: 1
    解释:
            只有[1,2,3]这一个排列有0个逆序对。

    例子2:
            Input: n = 3, k = 1
            Output: 2
    解释
            [3,2,1]有(3,2)、(3,1)、(2,1)三个逆序对,所以不达标。
            达标的只有:
            [1,3,2]只有(3,2)这一个逆序对,所以达标。
            [2,1,3]只有(2,1)这一个逆序对,所以达标。

    代码

    动态规划代码:

    1. public static int dp1(int N, int K) {
    2. if (N < 1 || K < 0) {
    3. return 0;
    4. }
    5. if (K == 0) {
    6. return 1;
    7. }
    8. int[][] dp = new int[N + 1][K + 1];
    9. dp[1][0] = 1;
    10. for (int i = 2; i <= N; i++) {
    11. dp[i][0] = 1;
    12. }
    13. for (int i = 2; i <= N; i++) {
    14. for (int j = 1; j <= K; j++) {
    15. for (int s = j; s >= Math.max(0, j - i + 1); s--) {
    16. dp[i][j] += dp[i - 1][s];
    17. }
    18. }
    19. }
    20. return dp[N][K];
    21. }

    优化动态规划中的迭代过程

    1. public static int dp2(int N, int K) {
    2. if (N < 1 || K < 0) {
    3. return 0;
    4. }
    5. if (K == 0) {
    6. return 1;
    7. }
    8. int[][] dp = new int[N + 1][K + 1];
    9. dp[1][0] = 1;
    10. for (int i = 2; i <= N; i++) {
    11. dp[i][0] = 1;
    12. }
    13. for (int i = 2; i <= N; i++) {
    14. for (int j = 1; j <= K; j++) {
    15. // if (i>j){
    16. // dp[i][j] = dp[i][j-1]+dp[i-1][j];
    17. // }
    18. // if (i<=j){
    19. // dp[i][j] = dp[i-1][j] + dp[i][j-1] -dp[i-1][j-1];
    20. // }
    21. dp[i][j] = dp[i][j - 1] + dp[i - 1][j] - (i <= j ? dp[i - 1][j - i] : 0);
    22. }
    23. }
    24. return dp[N][K];
    25. }
    26. public static void main(String[] args) {
    27. int N = 9;
    28. int K = 15;
    29. System.out.println(dp1(N, K));
    30. System.out.println(dp2(N, K));
    31. }

  • 相关阅读:
    Apache Kafka与Spring整合应用详解
    你能解释一下Spring AOP(面向切面编程)的概念和用法吗?在Spring中,如何使用事务管理?
    pyhton枚举列表对象
    智哪儿评测:既要便捷、安全和智能,也要颜值:萤石极光人脸视频锁Y3000FV体验评测
    使用WildCard充值ChatGPT Plus 会员
    Flutter 完全手册
    Linux 环境删除Conda
    北京易华录大数据高级研发师1103面试题
    Halcon二维码识别
    Nacos集群搭建
  • 原文地址:https://blog.csdn.net/z1171127310/article/details/128210005