Advertisement
_rashed

SRM513-D2-1000

Feb 21st, 2022
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #define ll long long
  2. #include <bits/stdc++.h>
  3. using namespace std;
  4.  
  5. const int OO = 1e9;
  6. const double EPS = 1e-9;
  7.  
  8. class CutTheNumbers{
  9.      public:
  10.      int arr[200000];
  11.      int numbers[16];
  12.      int n,m;
  13.      int cnt;
  14.  
  15.      int solve(int mask) {
  16.         //cout << "here at mask = " << mask << "\n";
  17.         if(arr[mask] != -1) {
  18.             return arr[mask];
  19.         }
  20.         int &ret = arr[mask];
  21.         ret = 0;
  22.         for(int i = 0; i < cnt; i++) {
  23.             int c_mask = 1 << i;
  24.             if(!(mask&c_mask)) {
  25.                 int r = i/m;
  26.                 ret = numbers[i] + solve(mask|c_mask);
  27.  
  28.                 //try row
  29.                 int row_mask = mask|c_mask;
  30.                 int row_sum = numbers[i];
  31.                 for(int ci = i+1; ci/m == r; ci++) {
  32.                     int ci_mask = (1 << ci);
  33.                     if(mask&ci_mask) {
  34.                         break;
  35.                     }
  36.                     row_mask |= ci_mask;
  37.                     row_sum = row_sum*10 + numbers[ci];
  38.                     ret = max(ret,row_sum+solve(row_mask));
  39.                 }
  40.  
  41.                 int col_mask = mask|c_mask;
  42.                 int col_sum = numbers[i];
  43.                 for(int ci = i+m; ci < cnt; ci += m) {
  44.                     int ci_mask = (1 << ci);
  45.                     if(mask&ci_mask) {
  46.                         break;
  47.                     }
  48.                     col_mask |= ci_mask;
  49.                     col_sum = col_sum*10 + numbers[ci];
  50.                     ret = max(ret,col_sum+solve(col_mask));
  51.                 }
  52.                 break;
  53.             }
  54.         }
  55.         return ret;
  56.      }
  57.      int maximumSum(vector <string> board) {
  58.         memset(arr,-1,sizeof(arr));
  59.         n = board.size();
  60.         m = board[0].size();
  61.         //cout << "n is " << n << " m is " << m << "\n";
  62.         cnt = n*m;
  63.         for(int i = 0; i < n; i++) {
  64.             for(int j = 0; j < m; j++) {
  65.                 numbers[i*m + j] = board[i][j] - '0';
  66.             }
  67.         }
  68.         return solve(0);
  69.      }
  70. };
  71.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement