【LintCode】869. 하나의 그룹의 착란을 찾아내다 (동적 기획)

965 단어 LintCode
동적 기획
상태 설정: f[i]는 i개 요소를 포함하는 배열이 생성할 수 있는 착란의 수량을 나타낸다
상태 전이 방정식: f[i] = (i - 1) * (f[i-1] + f[i-2])경계: f[1] = 0, f[2] = 1f[n]의 계산에 대해 n을 k번째 위치에 두었다고 가정하면 다음과 같다.
  • 이때 k를 n번째 위치에 두면 나머지 n-2개 원소의 착란은 f[n-2]
  • 이다
  • 만약에 k를 다른 위치에 두면 k는 n에 놓을 수 없다. n-1개 원소의 착란에서'k는 k에 놓을 수 없다'는 것은 등가이다. 즉, 이때는 f[n-1]
  • 이다.
    k 모두 n-1개의 선택이 있기 때문f[n] = (i - 1) * (f[n-1] + f[n-2])
    public class Solution {
        /**
         * @param n: an array consisting of n integers from 1 to n
         * @return: the number of derangement it can generate
         */
        public int findDerangement(int n) {
            if (n <= 1) {
                return 0;
            } 
            long[] dp = new long[n + 1];
            int mod = 1000000007;
            dp[2] = 1;
            for (int i=3; i < n + 1; i++) {
                dp[i] = (long) (i - 1) * (dp[i-2] + dp[i-1]) % mod;
            } 
            return (int)dp[n];
            
        }
    }

    좋은 웹페이지 즐겨찾기