給定一個矩陣,求子矩陣元素之和。
可以暴力遍歷,但是一般題目時間上不會允許你這么做。
通過預處理二維數組使得需要子矩陣之和時以O(1)直接求。
輸入:
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin >>map[i][j];
記dp[i][j]表示左上坐標(1,1),右下坐標(i,j)的子矩陣,map[i][j]表示矩陣(i,j)位置上的元素。
那么通過:dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]+map[i][j] 來預處理矩陣
code:
memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+map[i][j];
那么左上坐標(x1,y1),右下坐標(x2,y2)的子矩陣之和為:dp[x2][y2]-dp[x1-1][y2]-dp[x2][y1-1]+dp[x1-1][y1-1]
code:
for(int i=1;i<=k;i++)
{
int x1,x2,y1,y2;
cin >>x1>>y1>>x2>>y2;
cout <<(dp[x2][y2]+dp[x1-1][y1-1]-dp[x1-1][y2]-dp[x2][y1-1])<<endl;
}