题解黑格覆盖
Posted kcn999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解黑格覆盖相关的知识,希望对你有一定的参考价值。
题目描述
在一张由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; }
以上是关于题解黑格覆盖的主要内容,如果未能解决你的问题,请参考以下文章