c++
class NumMatrix {
public:
NumMatrix(vector<vector<int>> &matrix) {
if (matrix.empty())
return;
cum = matrix;
for (int i = 0; i < cum.size(); ++i) {
for (int j = 0; j < cum[i].size(); ++j) {
if (i == 0 && j == 0) {
cum[i][j] = cum[i][j]; continue;
}
if (i == 0) {
cum[i][j] = cum[i][j] + cum[i][j - 1]; continue;
}
if (j == 0) {
cum[i][j] = cum[i][j] + cum[i - 1][j]; continue;
}
cum[i][j] = cum[i][j] + cum[i][j - 1] + cum[i - 1][j] - cum[i - 1][j - 1];
}
}
}
int sumRegion(int row1, int col1, int row2, int col2) {
if (cum.empty()) return 0;
if (row1 == 0 && col1 == 0) return cum[row2][col2];
if (row1 == 0) return cum[row2][col2] - cum[row2][col1 - 1];
if (col1 == 0) return cum[row2][col2] - cum[row1 - 1][col2];
return cum[row2][col2] - cum[row2][col1 - 1] - cum[row1 - 1][col2] + cum[row1 - 1][col1 - 1];
}
private:
vector<vector<int>> cum;
};
reference:
http://blog.sina.com.cn/s/blog_4cb0b54301017wwo.html