You should build the array arr which has the following properties:
arr has exactly n integers.
1 <= arr[i] <= m where (0 <= i < n).
After applying the mentioned algorithm to arr, the value search_cost is equal to k.
Return the number of ways to build the array arr under the mentioned conditions. As the answer may grow large, the answer must be computed modulo 10^9 + 7.
We use dynamic programming to count the number of ways to build the array. The key is to track, for each position, the current maximum and the number of times the maximum has changed (i.e., the search cost). For each new element, we either keep the current maximum or increase it, incrementing the search cost.
classSolution {
public:int numOfArrays(int n, int m, int k) {
constint MOD =1e9+7;
vector<vector<vector<int>>> dp(n+1, vector<vector<int>>(m+1, vector<int>(k+1, 0)));
dp[0][0][0] =1;
for (int i =0; i < n; ++i) {
for (int mx =0; mx <= m; ++mx) {
for (int c =0; c <= k; ++c) {
if (dp[i][mx][c] ==0) continue;
for (int x =1; x <= m; ++x) {
if (x > mx && c+1<= k)
dp[i+1][x][c+1] = (dp[i+1][x][c+1] + dp[i][mx][c]) % MOD;
elseif (x <= mx)
dp[i+1][mx][c] = (dp[i+1][mx][c] + dp[i][mx][c]) % MOD;
}
}
}
}
int ans =0;
for (int mx =1; mx <= m; ++mx)
ans = (ans + dp[n][mx][k]) % MOD;
return ans;
}
};
classSolution {
publicintnumOfArrays(int n, int m, int k) {
int MOD = 1_000_000_007;
int[][][] dp =newint[n+1][m+1][k+1];
dp[0][0][0]= 1;
for (int i = 0; i < n; i++) {
for (int mx = 0; mx <= m; mx++) {
for (int c = 0; c <= k; c++) {
if (dp[i][mx][c]== 0) continue;
for (int x = 1; x <= m; x++) {
if (x > mx && c+1 <= k)
dp[i+1][x][c+1]= (dp[i+1][x][c+1]+ dp[i][mx][c]) % MOD;
elseif (x <= mx)
dp[i+1][mx][c]= (dp[i+1][mx][c]+ dp[i][mx][c]) % MOD;
}
}
}
}
int ans = 0;
for (int mx = 1; mx <= m; mx++)
ans = (ans + dp[n][mx][k]) % MOD;
return ans;
}
}
classSolution {
funnumOfArrays(n: Int, m: Int, k: Int): Int {
val MOD = 1_000_000_007
val dp = Array(n+1) { Array(m+1) { IntArray(k+1) } }
dp[0][0][0] = 1for (i in0 until n) {
for (mx in0..m) {
for (c in0..k) {
if (dp[i][mx][c] ==0) continuefor (x in1..m) {
if (x > mx && c+1<= k)
dp[i+1][x][c+1] = (dp[i+1][x][c+1] + dp[i][mx][c]) % MOD
elseif (x <= mx)
dp[i+1][mx][c] = (dp[i+1][mx][c] + dp[i][mx][c]) % MOD
}
}
}
}
var ans = 0for (mx in1..m)
ans = (ans + dp[n][mx][k]) % MOD
return ans
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution:
defnumOfArrays(self, n: int, m: int, k: int) -> int:
MOD =10**9+7 dp: list[list[list[int]]] = [[[0] * (k+1) for _ in range(m+1)] for _ in range(n+1)]
dp[0][0][0] =1for i in range(n):
for mx in range(m+1):
for c in range(k+1):
if dp[i][mx][c] ==0:
continuefor x in range(1, m+1):
if x > mx and c+1<= k:
dp[i+1][x][c+1] = (dp[i+1][x][c+1] + dp[i][mx][c]) % MOD
elif x <= mx:
dp[i+1][mx][c] = (dp[i+1][mx][c] + dp[i][mx][c]) % MOD
ans =0for mx in range(1, m+1):
ans = (ans + dp[n][mx][k]) % MOD
return ans
impl Solution {
pubfnnum_of_arrays(n: i32, m: i32, k: i32) -> i32 {
constMOD: i32=1_000_000_007;
let (n, m, k) = (n asusize, m asusize, k asusize);
letmut dp =vec![vec![vec![0; k+1]; m+1]; n+1];
dp[0][0][0] =1;
for i in0..n {
for mx in0..=m {
for c in0..=k {
let val = dp[i][mx][c];
if val ==0 { continue; }
for x in1..=m {
if x > mx && c+1<= k {
dp[i+1][x][c+1] = (dp[i+1][x][c+1] + val) %MOD;
} elseif x <= mx {
dp[i+1][mx][c] = (dp[i+1][mx][c] + val) %MOD;
}
}
}
}
}
letmut ans =0;
for mx in1..=m {
ans = (ans + dp[n][mx][k]) %MOD;
}
ans
}
}