Giả sử chúng ta có hai số nguyên n và k, chúng ta phải tìm bao nhiêu mảng khác nhau gồm các số từ 1 đến n sao cho có đúng k cặp nghịch đảo. Cặp nghịch đảo dành cho phần tử thứ i và thứ j trong mảng, nếu i
Vì vậy, nếu đầu vào là n =3 và k =1, thì đầu ra sẽ là 2 vì mảng [1,3,2] và [2,1,3] sẽ chỉ có một cặp nghịch đảo.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một dp mảng 2D có kích thước (n + 1) x (k + 1)
- dp [0, 0]:=1
- để khởi tạo i:=1, khi i <=n, cập nhật (tăng i lên 1), thực hiện -
- dp [i, 0]:=1
- để khởi tạo j:=1, khi j <=k, cập nhật (tăng j lên 1), thực hiện -
- dp [i, j]:=dp [i, j - 1] + dp [i - 1, j]
- dp [i, j]:=dp [i, j] mod m
- nếu j> =i, thì -
- dp [i, j]:=(dp [i, j] - dp [i - 1, j - i] + m) mod m
- trả về dp [n, k]
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#include <bits/stdc++.h>
using namespace std;
const int m = 1e9 + 7;
class Solution {
public:
int kInversePairs(int n, int k) {
vector < vector <int> > dp(n + 1, vector <int>(k + 1));
dp[0][0] = 1;
for(int i = 1; i <= n; i++){
dp[i][0] = 1;
for(int j = 1; j <= k; j++){
dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
dp[i][j] %= m;
if(j >= i){
dp[i][j] = (dp[i][j] - dp[i - 1][j - i] + m) % m;
}
}
}
return dp[n][k];
}
};
main(){
Solution ob;
cout << (ob.kInversePairs(4,2));
} Đầu vào
4 2
Đầu ra
5