1. 程式人生 > >【題解】黑格覆蓋

【題解】黑格覆蓋

iostream i++ 請問 span using 正方形 pla alt color

題目描述

在一張由M×N個小正方形格子組成的矩形紙張上,有k個格子被塗成了黑色。給你一張由m×n個同樣小正方形組成的矩形卡片,請問該卡片最多能一次性覆蓋多少個黑格子?

輸入輸出格式

輸入格式

輸入共k+1行:

第1行為5個整數M、N、m、n、k,其含義如題目所述。

接下來k行,每行2個整數,分別表示被塗成黑色的格子的行、列坐標。

輸出格式

共1行,1個整數,表示卡片一次性最多能覆蓋的黑格子數。

輸入輸出樣例

輸入樣例

3 5 2 2 3

1 1

2 2

3 5

輸出樣例

2

說明

樣例說明

根據樣例數據所得到的塗完黑格的矩形和用於覆蓋的矩形如下圖所示:

技術分享圖片

數據規模

對於40%的數據:m=n;

對於100%的數據:M、N、m、n、k 均小於等於1000,所有黑格不重復出現。

題解

二維前綴和模板題,註意紙張可以旋轉。

技術分享圖片
#include<iostream>
#include<algorithm>

using namespace std;

int M,N;
int m,n;
int k; int a[1001][1001]; int b[1001][1001]; int ans,bns; int main() { cin>>M>>N>>m>>n>>k; for(int i=1,x,y;i<=k;i++) { cin>>x>>y; a[x][y]=1; } for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { b[i][j]
=a[i][j]+b[i-1][j]+b[i][j-1]-b[i-1][j-1]; } } for(int i=1;i<=M;i++) { for(int j=1;j<=N;j++) { ans=max(b[i][j]-b[max(0,i-m)][j]-b[i][max(0,j-n)]+b[max(0,i-m)][max(0,j-n)],ans); bns=max(b[i][j]-b[max(0,i-n)][j]-b[i][max(0,j-m)]+b[max(0,i-n)][max(0,j-m)],bns); } } cout<<max(ans,bns); return 0; }
參考程序

【題解】黑格覆蓋