美文网首页
错排问题 错排列题解(Java 递归方法 动态规划方法)

错排问题 错排列题解(Java 递归方法 动态规划方法)

作者: IT志男 | 来源:发表于2018-05-18 11:38 被阅读86次

错排问题组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的排列就称为原排列的一个错排
错排问题-维基百科

思路:
设方法f(n),f(n)为n个元素的错排结果数
当n == 1时,无法完成错排,所以结果为0
当n == 2时,只有一种错排方式,所以结果为1
当n >= 3时考虑:
将元素n放到k位置,有(n - 1)种方法

  • 此时考虑元素k
    1 假如元素k放到了n的位置,那么就还剩下(n - 2)个元素,这些元素错排的结果数为f(n - 2)
    2 假如元素k不放到n的位置上,那么就剩下(n - 1)个元素,这里也边包括了元素k,这些元素错排的结果数为f(n - 1)

由此得到递归式:(n - 1) * (f(n - 2) + f(n - 1))

package com.example.demo;

import java.util.HashMap;

public class DSolution {
    public static void main(String[] args) {
        DSolution ds = new DSolution();
        System.out.println(new DSolution().dpCount(7));
        System.out.println(new DSolution().dpCount(6));
        System.out.println(new DSolution().dpCount(5));
    }

    private int dCount(int n) {
        if (n == 1) {
            return 0;
        }
        if (n == 2) {
            return 1;
        }
        return (n - 1) * (dCount(n - 1) + dCount(n - 2));
    }

    private int dpCount(int n) {
        HashMap<Integer, Integer> resultMap = new HashMap<>();
        resultMap.put(0, 0);
        resultMap.put(1, 0);
        resultMap.put(2, 1);
        for(int i = 3; i <= n; i++) {
            resultMap.put(i, (i - 1) * (resultMap.get(i - 1) + resultMap.get(i - 2)));
        }
        return resultMap.get(n);
    }
}

其中dCount为递归解法,dpCount为动态规划解法。

相关文章

  • 错排问题 错排列题解(Java 递归方法 动态规划方法)

    错排问题是组合数学中的问题之一。考虑一个有n个元素的排列,若一个排列中所有的元素都不在自己原来的位置上,那么这样的...

  • JNI DETECTED ERROR IN APPLICATIO

    报了好几种错,最后报到这个错之后,从编码问题入手后,问题解决了 写个转换方法即可

  • 动态规划与递归

    动态规划与递归 从研究虚拟dom的实现中看到动态规划的概念。 斐波那契的例子 动态规划与递归的区别从子问题解决原问...

  • 求组合数

    排列组合是经常遇到的问题,本篇文章想跟大家探讨一下,对于给定的,我们该如何去求组合数。 方法一:递归(动态规划) ...

  • 70.(动态规划)爬楼梯

    解决方法1:递归+记忆搜索 使用动态规划

  • 算法图解-快速排序

    1. 分而治之分而治之(divide and conquer,D&C)——一种著名的递归式问题解决方法。快速排就是...

  • 排列

    排列 a,b,c的排列形式有abc,acb,bac,bca,cab,cba,六种排列方式。 采用递归的方法来实现排...

  • 动态规划法(一)从斐波那契数列谈起

    动态规划法与分治方法   动态规划(Dynamic Programming)与分治方法相似,都是通过组合子问题的解...

  • HJ14 字符串排序

    方法一:自带sort方法排序方法二:递归,快排

  • 剑指offer-丑数

    这题自己的方法竟然超时了,看了题解,用了动态规划 自己也想过动态规划,就是不知道状态转移方程要怎么写。 dp[i]...

网友评论

      本文标题:错排问题 错排列题解(Java 递归方法 动态规划方法)

      本文链接:https://www.haomeiwen.com/subject/tqxgdftx.html