题目大意:给出二维数组,求出以左上角(row1,col1)和右下角(row2,col2)这两个点组成的矩形内的数字之和
分析:动规。
状态:dp[i + 1][j + 1]——以matrix[0][0]和matrix[i][j]这两个点组成的矩形内的数字之和
结果:sum(row1,col1,row2,col2)=dp[row2+1][col2+1]-dp[row2+1][col1]-dp[row1][col2+1]+dp[row1][col1]
状态转移方程:dp[i+1][j+1]=dp[i][j+1]+dp[i+1][j]-dp[i][j]+matrix[i][j]
代码:
class NumMatrix {
public:
vector<vector<int>> dp;
NumMatrix(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) return;
dp = vector<vector<int>>(matrix.size() + 1,vector<int>(matrix[0].size() + 1));
for(int i = 0;i < matrix.size();i++){
for(int j = 0;j < matrix[0].size();j++){
dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j] - dp[i][j] + matrix[i][j];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
if(dp.size() == 0) return 0;
return dp[row2 + 1][col2 + 1] - dp[row1][col2 + 1] - dp[row2 + 1][col1] + dp[row1][col1];
}
};
/**
* Your NumMatrix object will be instantiated and called as such:
* NumMatrix* obj = new NumMatrix(matrix);
* int param_1 = obj->sumRegion(row1,col1,row2,col2);
*/