Advertisement
pb_jiang

code/1444.number-of-ways-of-cutting-a-pizza.cpp

Jun 30th, 2022
65
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.94 KB | None | 0 0
  1. class Solution
  2. {
  3.     using ll = long long;
  4.     static const int MOD = 1000 * 1000 * 1000 + 7;
  5.     int m, n, gk;
  6.     vector<vector<vector<ll>>> dp;
  7.     vector<vector<int>> acc_row;
  8.     vector<vector<int>> acc_col;
  9.  
  10.     int search(const vector<string> &pz, int k, int row, int col)
  11.     {
  12.         if (row >= m || col >= n)
  13.             return 0;
  14.         if (dp[k][row][col] != -1)
  15.             return dp[k][row][col];
  16.  
  17.         ll ret = 0;
  18.         int row_apple_cnt = 0;
  19.         for (int i = row; i < m; ++i) {
  20.             row_apple_cnt += acc_row[i][n] - acc_row[i][col];
  21.             if (row_apple_cnt) {
  22.                 if (k > 1) {
  23.                     ret = (ret + search(pz, k - 1, i + 1, col)) % MOD;
  24.                 } else {
  25.                     ret = 1;
  26.                     break;
  27.                 }
  28.             }
  29.         }
  30.         int col_apple_cnt = 0;
  31.         for (int j = col; j < n; ++j) {
  32.             col_apple_cnt += acc_col[m][j] - acc_col[row][j];
  33.             if (col_apple_cnt) {
  34.                 if (k > 1) {
  35.                     ret = (ret + search(pz, k - 1, row, j + 1)) % MOD;
  36.                 } else {
  37.                     ret = 1;
  38.                     break;
  39.                 }
  40.             }
  41.         }
  42.  
  43.         return (int) (dp[k][row][col] = ret % MOD);
  44.     }
  45.  
  46.   public:
  47.     int ways(vector<string> &pz, int k)
  48.     {
  49.         m = pz.size(), n = pz[0].size(), gk = k;
  50.  
  51.         dp = vector<vector<vector<ll>>>(k + 1, vector<vector<ll>>(m + 1, vector<ll>(n + 1, -1)));
  52.         acc_row = vector<vector<int>>(m + 1, vector<int>(n + 1));
  53.         acc_col = vector<vector<int>>(m + 1, vector<int>(n + 1));
  54.         for (int i = 0; i < m; ++i) {
  55.             for (int j = 0; j < n; ++j) {
  56.                 acc_row[i][j + 1] = acc_row[i][j] + (pz[i][j] == 'A' ? 1 : 0);
  57.                 acc_col[i + 1][j] = acc_col[i][j] + (pz[i][j] == 'A' ? 1 : 0);
  58.             }
  59.         }
  60.  
  61.         return search(pz, k, 0, 0);
  62.     }
  63. };
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement