Giả sử chúng ta có ba số nguyên n, m và k. Nếu chúng ta có thuật toán sau để tìm phần tử lớn nhất của một mảng các số nguyên dương -
max_val := -1 max_ind := -1 search_cost := 0 n := size of arr for initialize i := 0, when i < n, update (increase i by 1), do: if max_val < arr[i], then: max_val := arr[i] max_ind := i (increase search_cost by 1) return max_ind
Chúng ta phải tạo mảng arr có các tiêu chí sau:arr có đúng n số nguyên. tất cả các phần tử arr [i] nằm trong khoảng từ 1 đến m (bao gồm cả) (0 <=i
Vì vậy, nếu đầu vào là n =2, m =3, k =1, thì đầu ra sẽ là 6 vì các mảng có thể có là [1, 1], [2, 1], [2, 2], [3 , 1], [3, 2] [3, 3]
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
m:=10 ^ 9 + 7
Xác định một hàm add (), điều này sẽ lấy a, b,
return ((a mod m) + (b mod m)) mod m
Xác định một mảng dp có kích thước:54 x 54 x 105.
Xác định một hàm help (), hàm này sẽ nhận idx, m, k, currVal, n,
nếu k <0, thì -
trả về 0
nếu idx giống n + 1 thì -
trả về true khi k bằng 0
nếu dp [idx, k, currVal + 1] không bằng -1 thì -
trả về dp [idx, k, currVal + 1]
ret:=0
để khởi tạo i:=1, khi i <=m, cập nhật (tăng i lên 1), thực hiện -
nếu tôi> currVal, thì -
ret:=add (help (idx + 1, m, k - 1, max (currVal, i), n), ret)
Nếu không
ret:=add (help (idx + 1, m, k, max (currVal, i), n), ret)
trả về dp [idx, k, currVal + 1] =ret
Từ phương thức chính, hãy làm như sau -
để khởi tạo i:=0, khi tôi <54, hãy cập nhật (tăng i lên 1), thực hiện -
để khởi tạo j:=0, khi j <54, cập nhật (tăng j lên 1), thực hiện -
để khởi tạo k:=0, khi k <105, cập nhật (tăng k lên 1), thực hiện -
dp [i, j, k]:=-1
ret:=help (1, m, k, -1, n)
trả lại ret
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;
typedef long long int lli;
const lli m = 1e9 + 7;
class Solution {
public:
lli add(lli a, lli b) {
return ((a % m) + (b % m)) % m;
}
int dp[54][54][105];
int help(int idx, int m, int k, int currVal, int n) {
if (k < 0)
return 0;
if (idx == n + 1) {
return k == 0;
}
if (dp[idx][k][currVal + 1] != -1)
return dp[idx][k][currVal + 1];
int ret = 0;
for (int i = 1; i <= m; i++) {
if (i > currVal) {
ret = add(help(idx + 1, m, k - 1, max(currVal, i), n), ret);
}
else {
ret = add(help(idx + 1, m, k, max(currVal, i), n), ret);
}
}
return dp[idx][k][currVal + 1] = ret;
}
int numOfArrays(int n, int m, int k) {
for (int i = 0; i < 54; i++)
for (int j = 0; j < 54; j++)
for (int k = 0; k < 105; k++)
dp[i][j][k] = -1;
int ret = help(1, m, k, -1, n);
return ret;
}
};
main() {
Solution ob;
cout << (ob.numOfArrays(2, 3, 1));
}
Đầu vào
2, 3, 1
Đầu ra
6