Use this to learn the idea, then write your own version.
1class Solution {2 public:3 int ways(vector<string>& pizza, int k) {4 const int M = pizza.size();5 const int N = pizza[0].size();6 vector<vector<vector<int>>> mem(M,7 vector<vector<int>>(N, vector<int>(k, -1)));8 vector<vector<int>> prefix(M + 1, vector<int>(N + 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][j] == 'A') + 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:19 static constexpr int kMod = 1'000'000'007;20 21 22 int ways(int m, int n, int k, const int M, const int N,23 const vector<vector<int>>& prefix,24 vector<vector<vector<int>>>& mem) {25 if (k == 0)26 return hasApple(prefix, m, M, n, N) ? 1 : 0;27 if (mem[m][n][k] != -1)28 return mem[m][n][k];29 30 mem[m][n][k] = 0;31 32 for (int i = m + 1; i < M; ++i) 33 if (hasApple(prefix, m, i, n, N) && hasApple(prefix, i, M, n, N)) {34 mem[m][n][k] += ways(i, n, k - 1, M, N, prefix, mem);35 mem[m][n][k] %= kMod;36 }37 38 for (int j = n + 1; j < N; ++j) 39 if (hasApple(prefix, m, M, n, j) && hasApple(prefix, m, M, j, N)) {40 mem[m][n][k] += ways(m, j, k - 1, M, N, prefix, mem);41 mem[m][n][k] %= kMod;42 }43 44 return mem[m][n][k];45 }46 47 48 bool hasApple(const vector<vector<int>>& prefix, int row1, int row2, int col1,49 int col2) {50 return (prefix[row2][col2] - prefix[row1][col2] - 51 prefix[row2][col1] + prefix[row1][col1]) > 0;52 };53};54