1. 程式人生 > 實用技巧 >字首和矩陣求和

字首和矩陣求和

字首和

已知n*m矩陣,q次詢問,每次給出子矩陣左上角和右下角座標,求子矩陣的和。

1.暴力演算法 直接樸素的多重迴圈累加每一元素

2.優化演算法

用s(x,y)(x,y)表示面積

s(m,n)(p,q)=s(0,0)(p,q)-s(0,0)(m,q)-s(0,0)(p,n)+s(0,0)(m,n)

3.更優化演算法

include

include//可用<bits/stdc++.h>

using namespace std;//c++標準打法

long long N, M, e, query, x1, y1, x2, y2, ans, sum[2005][2005] = {0};//定義變數

int main() {

while (cin >> N >> M) { //cin和printf函式值固定為1

    for (int i = 1; i <= N; ++i) {

        for (int j = 1; j <= M; ++j) {

            cin >> e;

            sum[i][j] = sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + e;

        }

    }

    cin >> query;

    while (query--) { //query到零時停

        cin >> x1 >> y1 >> x2 >> y2;

        ans = sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1];

        cout << ans << endl;

    }

}

return 0;

}