2
public int numOfArrays(int n, int m, int k) {3
int M = (int) 1e9 + 7, ans = 0;4
int[][] dp = new int[m + 1][k + 1]; // maximum value, num of elements seen from left side5
for (int i = 1; i <= m; i++) {6
dp[i][1] = 1; // base case8
for (int i = 2; i <= n; i++) {9
int[][] next = new int[m + 1][k + 1];10
for (int j = 1; j <= m; j++) { // for the current max value11
for (int p = 1; p <= m; p++) { // previous max value12
for (int w = 1; w <= k; w++) { // for all possible k13
if (j > p) { // if current max is larger, update next[j][w] from dp[p][w-1]14
next[j][w] += dp[p][w - 1];16
} else { // otherwise, update next[p][w] from dp[p][w]17
next[p][w] += dp[p][w];25
for (int i = 1; i <= m; i++) { // loop through max that has k and sum them up.