(M)Dynamic Programming:304. Range Sum Query 2D

来源:互联网 发布:a5源码被骗 编辑:程序博客网 时间:2024/05/16 05:10

这道题是受了(M)Dynamic Programming:221. Maximal Square的启发,写法一样的。建立一个二维数组dp,dp[i][j]表示(0,0)到(i,j)的矩阵之和。如果要求的正方形是(x1,y1),(x2,y2),那么要考虑dp(row1-1,col2),dp(row2, col1-1),dp(row1-1,col1-1)。

class NumMatrix {public:    vector<vector<int>> dp;    int m = 0;    int n = 0;    NumMatrix(vector<vector<int>> matrix) {        if(!matrix.empty())        {            m = matrix.size();            n = matrix[0].size();            for(int i = 0; i < m; ++i)            {                dp.push_back(vector<int>(n, 0));            }            for(int i = 0; i < m; ++i)            {                for(int j = 0; j < n; ++j)                {                    int up = (i - 1 < 0)?0:dp[i - 1][j];                    int left = (j - 1 < 0)?0:dp[i][j - 1];                    int leftup = (i - 1 >= 0 && j - 1 >= 0)?dp[i - 1][j - 1]:0;                    dp[i][j] = up + left - leftup + matrix[i][j];                }            }        }    }        int sumRegion(int row1, int col1, int row2, int col2) {        int up = (row1 - 1 >= 0)?dp[row1 - 1][col2]:0;        int left = (col1 - 1 >= 0)?dp[row2][col1 - 1]:0;        int leftup = (row1 - 1 >= 0 && col1 - 1 >= 0)?dp[row1 - 1][col1 - 1]:0;        return dp[row2][col2] - up - left + leftup;    }};/** * Your NumMatrix object will be instantiated and called as such: * NumMatrix obj = new NumMatrix(matrix); * int param_1 = obj.sumRegion(row1,col1,row2,col2); */