leetcode 629 K Inverse Pairs Array

3051 단어 동적 기획
문제 설명:
Given two integers n and k , find how many different arrays consist of numbers from 1 to n such that there are exactly k inverse pairs.
We define an inverse pair as following: For ith and jth element in the array, if i < j and a[i] > a[j] then it’s an inverse pair; Otherwise, it’s not.
Since the answer may very large, the answer should be modulo 109 + 7.
Example 1:
Input: n = 3, k = 0
Output: 1
Explanation: 
Only the array [1,2,3] which consists of numbers from 1 to 3 has exactly 0 inverse pair.

Example 2:
Input: n = 3, k = 1
Output: 2
Explanation: 
The array [1,3,2] and [2,1,3] have exactly 1 inverse pair.

Note:
  • The integer n is in the range [1, 1000] and k is in the range [0, 1000].

  • 이런 n이 있을 때 몇 가지 상황이 존재하는지만 요구하고 구체적인 문제를 일일이 열거할 필요가 없다. 보통 동적 기획 방법을 이용한다.n에서 n+1으로 점차 미루다.분석은 다음과 같다. f(n,k)는 n개의 연속수의 전체 배열에 k개의 역순으로 배열된 수가 있음을 나타낸다.가령 f(n,k)가 0<=s1,s2,......로 구체적으로 표현된다고 가정하면sn<=n, f(n+1,k)는 s1,s2,......, sn 뒤에 n+1을 추가할 수 있다. 그 중에서 n+1>n>=s1,s2,......n, 이때 역순 쌍의 개수를 증가하지 않았습니다. 여전히 k개입니다.마찬가지로 f(n,k-1)의 배열에서 n+1을 마지막 수 앞에 놓으면 역순쌍이 증가하여 n+1의 경우 k개의 역순쌍이 존재한다.시골에서 점차적으로 추진하는 과정에서 n+1의 경우 k의 수치가 n보다 훨씬 클 수 있음을 고려해야 한다. 이때 f(n+1,k)=f(n,k)+f(n,k)+f(n,k-1)+...+f(n,max(0,k-n)). 시간의 복잡도를 낮추기 위해 f(n,k)+f(n,k-1)+...+를 구합니다f(n,max(0,k-n))의 과정에서 이전의 구와 결과를 이용하여 계산할 수 있다.코드는 다음과 같습니다.
    public int kInversePairs(int n, int k) {
        int mo=1000000007;
            int[][] f=new int[1002][1002];
            f[1][0]=1;
            for (int i=2;i<=n;i++)
            {
                f[i][0]=1;
                for (int j=1;j<=k;j++) 
                {
                    f[i][j]=(f[i][j-1]+f[i-1][j])%mo;
                    if (j>=i) f[i][j]=(f[i][j]-f[i-1][j-i]+mo)%mo;
                }
            }
            return f[n][k];
    }

    좋은 웹페이지 즐겨찾기