Advertisement
nikunjsoni

1895

Jun 13th, 2021
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. O(n^4) solutions...
  2.  
  3. class Solution {
  4. public:
  5.     int largestMagicSquare(vector<vector<int>>& grid) {
  6.         int m = grid.size(), n = grid[0].size(), res = 0;
  7.         vector<vector<int>> rows(m + 2, vector<int>(n + 2)), cols(rows), d1(rows), d2(rows);
  8.         for (int i = 1; i <= m; ++i)
  9.             for (int j = 1; j <= n; ++j) {
  10.                 rows[i][j] += grid[i - 1][j - 1] + rows[i][j - 1];
  11.                 cols[i][j] += grid[i - 1][j - 1] + cols[i - 1][j];
  12.                 d1[i][j] += grid[i - 1][j - 1] + d1[i - 1][j - 1];
  13.                 d2[i][j] += grid[i - 1][j - 1] + d2[i - 1][j + 1];
  14.             }
  15.         for (int i = 1; i <= m; ++i)
  16.             for (int j = 1; j <= n; ++j)
  17.                 for (int k = min(m - i, n - j); k > res; --k) {
  18.                     int sum = d1[i + k][j + k] - d1[i - 1][j - 1];
  19.                     bool match = sum == d2[i + k][j] - d2[i - 1][j + k + 1];
  20.                     for (int l = 0; l <= k && match; ++l) {
  21.                         match &= sum == rows[i + l][j + k] - rows[i + l][j - 1];
  22.                         match &= sum == cols[i + k][j + l] - cols[i - 1][j + l];
  23.                     }
  24.                     res = match ? k : res;
  25.                 }
  26.         return res + 1;
  27.     }
  28. };
  29.  
  30. -----------
  31.  
  32. class Solution {
  33. public:
  34.     int largestMagicSquare(vector<vector<int>>& grid) {
  35.         int rows=grid.size(), cols=grid[0].size();
  36.         int dp[rows+1][cols+1][4];
  37.         memset(dp, 0, sizeof dp);
  38.         for(int i=0; i<rows; i++)
  39.             for(int j=0; j<cols; j++){
  40.                 dp[i][j][0] = dp[i][j][1] = dp[i][j][2] = dp[i][j][3] = grid[i][j];
  41.                 if(j-1 >= 0)
  42.                     dp[i][j][0] += (dp[i][j-1][0]);
  43.                 if(i-1>=0)
  44.                     dp[i][j][1] += (dp[i-1][j][1]);
  45.                 if(i-1>=0 && j-1>=0)
  46.                     dp[i][j][2] += (dp[i-1][j-1][2]);
  47.                 if(j+1 <= cols-1 && i-1 >= 0)
  48.                     dp[i][j][3] += (dp[i-1][j+1][3]);
  49.                 //cout<<dp[i][j][0]<<" "<<dp[i][j][1]<<" "<<dp[i][j][2]<<" "<<dp[i][j][3]<<endl;
  50.             }
  51.         int ans = 1;
  52.         for(int i=0; i<rows; i++){
  53.             for(int j=0; j<cols; j++){
  54.                 for(int k=min(i,j); k>0; k--){
  55.                     int sx = i-k, sy=j-k;
  56.                     int dsum, adsum;
  57.                     bool same = true;
  58.                     if(!sx || !sy)
  59.                         dsum = dp[i][j][2];
  60.                     else
  61.                         dsum = dp[i][j][2]-dp[sx-1][sy-1][2];
  62.                        
  63.                     int dx = i, dy = sy, ndx = sx, ndy = j;
  64.                     if(ndx==0 || ndy==cols-1)
  65.                         adsum = dp[dx][dy][3];
  66.                     else
  67.                         adsum = dp[dx][dy][3]-dp[ndx-1][ndy+1][3];
  68.                    
  69.                     if(dsum != adsum) continue;
  70.                     int csum = 0;
  71.                     for(int r=sx; r<=i && same; r++){
  72.                         if(!sy)
  73.                             csum = dp[r][j][0];
  74.                         else
  75.                             csum = dp[r][j][0]-dp[r][sy-1][0];
  76.                         //cout<<csum<<" "<<i<<" "<<j<<" "<<k<<endl;
  77.                         if(csum != dsum){
  78.                             same = false;
  79.                         }
  80.                     }
  81.                    
  82.                     for(int c=sy; c<=j && same; c++){
  83.                         if(!sx)
  84.                             csum = dp[i][c][1];
  85.                         else
  86.                             csum = dp[i][c][1]-dp[sx-1][c][1];
  87.                         if(csum != dsum)
  88.                             same = false;
  89.                     }
  90.                     if(same)
  91.                         ans = max(ans, k+1);
  92.                 }
  93.             }
  94.         }
  95.         return ans;
  96.     }
  97. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement