TwoDimensionalRMQ

/**
 * Two Dimensional DMQ, Time Complexity O(n*m*logn*logm)
 * the index of array begins at 1
 */
int val[310][310];      // store values
int dp[310][310][9][9]; // store maxium value
// dp[i][j][k][l] represents for in the diagonal x-axis(i,i+2**k-1)
// y-axis(j,j+2**l-1), the maxium value is dp[][][][]
int mm[310];                 //二进制位数减去1,使用前需要初始化
void initRMQ(int n, int m) { // n rows, m colums
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      dp[i][j][0][0] = val[i][i];
    }
  }
  mm[0] = -1;
  for (int i = 1; i <= max(n, m); i++) {
    mm[i] = ((i & (i - 1)) == 0 ? mm[i - 1] + 1 : mm[i - 1]);
  }
  for (int ii = 0; ii <= mm[n]; ii++) {
    for (int jj = 0; jj <= mm[m]; jj++) {
      if (ii + jj) {
        for (int i = 1; i + (1 << ii) - 1 <= n; i++) {
          for (int j = 1; j + (1 << jj) - 1 <= m; j++) {
            if (ii) {
              dp[i][j][ii][jj] = max(dp[i][j][ii - 1][jj],
                                     dp[i + 1 << (ii - 1)][j][ii - 1][jj]);
            } else {
              dp[i][j][ii][jj] =
                  max(dp[i][j][ii][jj - 1], dp[i][j + (1 << (jj−1))][ii][jj−1]);
            }
          }
        }
      }
    }
  }
  // query the maxium value in matrix
}
// query the maxium value in matrix
int rmq(int x1, int y1, int x2, int y2) {
  int k1 = mm[x2 - x1 + 1]; // neareste integer of log(x2-x1+1)
  int k2 = mm[y2 - y1 + 1];

  x2 = x2 - (1 << k1) + 1;
  y2 = y2 - (1 << k2) + 1;
  return max(max(dp[x1][y1][k1][k2], dp[x1][y2][k1][k2]),
             max(dp[x2][y1][k1][k2], dp[x2][y2][k1][k2]));
}
  • 二维DMQ, 来自kuangbin的板子
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值