原题链接:https://leetcode-cn.com/problems/range-sum-query-2d-immutable/
1、暴力(超时)
class NumMatrix {
public:
vector<vector<int>> matrix;
NumMatrix(vector<vector<int>>& matrix) {
this->matrix=matrix;
}
int sumRegion(int row1, int col1, int row2, int col2) {
int sum=0;
for(int i=row1;i<=row2;i++){
for(int j=col1;j<=col2;j++){
sum+=matrix[i][j];
}
}
return sum;
}
};
2、动态规划+记忆化(通过)
dp[i][j]表示以(i,j)为右下角的正方形里元素总和
于是转移方程为:
sum(abcd)=sum(od)−sum(ob)−sum(oc)+sum(oa)
代码:
vector<vector<int>> dp;
NumMatrix(vector<vector<int>>& matrix) {
if(matrix.empty()) return;
int m=matrix.size();
int n=matrix[0].size();
this->dp.resize(m+1,vector<int>(n+1,0));
for(int i=1;i<m+1;i++){
for(int j=1;j<n+1;j++){
this->dp[i][j]=matrix[i-1][j-1]+dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
return dp[row2+1][col2+1]-dp[row1][col2+1]-dp[row2+1][col1]+dp[row1][col1];
}