这道题是受了(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);
*/