Use this to learn the idea, then write your own version.
1class Solution {2 public int ways(String[] pizza, int k) {3 final int M = pizza.length;4 final int N = pizza[0].length();5 int[][][] mem = new int[M][N][k];6 int[][] prefix = new int[M + 1][N + 1];7 8 Arrays.stream(mem).forEach(A -> Arrays.stream(A).forEach(B -> Arrays.fill(B, -1)));9 10 for (int i = 0; i < M; ++i)11 for (int j = 0; j < N; ++j)12 prefix[i + 1][j + 1] = (pizza[i].charAt(j) == 'A' ? 1 : 0) + prefix[i][j + 1] +13 prefix[i + 1][j] - prefix[i][j];14 15 return ways(0, 0, k - 1, M, N, prefix, mem);16 }17 18 private static final int MOD = 1_000_000_007;19 20 21 private int ways(int m, int n, int k, int M, int N, int[][] prefix, int[][][] mem) {22 if (k == 0)23 return hasApple(prefix, m, M, n, N) ? 1 : 0;24 if (mem[m][n][k] != -1)25 return mem[m][n][k];26 27 mem[m][n][k] = 0;28 29 for (int i = m + 1; i < M; ++i) 30 if (hasApple(prefix, m, i, n, N) && hasApple(prefix, i, M, n, N)) {31 mem[m][n][k] += ways(i, n, k - 1, M, N, prefix, mem);32 mem[m][n][k] %= MOD;33 }34 35 for (int j = n + 1; j < N; ++j) 36 if (hasApple(prefix, m, M, n, j) && hasApple(prefix, m, M, j, N)) {37 mem[m][n][k] += ways(m, j, k - 1, M, N, prefix, mem);38 mem[m][n][k] %= MOD;39 }40 41 return mem[m][n][k];42 }43 44 45 private boolean hasApple(int[][] prefix, int row1, int row2, int col1, int col2) {46 return (prefix[row2][col2] - prefix[row1][col2] - 47 prefix[row2][col1] + prefix[row1][col1]) > 0;48 }49}50