【DP】2014年東莞市小學生程式設計複賽試題 打磚塊
阿新 • • 發佈:2018-12-14
題目
KXT是一個很無聊的小朋友,一天到晚都在打坐… 一天,被他發現了一個比打坐更無聊的事情——打磚塊。很多塊磚分佈在一個mm的矩陣中,他可以消掉以他為左上角頂點的一個nn的矩陣裡的所有磚塊。 喜歡偷懶的他請來了你幫他計算可以消掉最多的磚塊數(只能消一次)。
輸入
第一行:用空格隔開的三個整數n、m、k。 接下來k行,每行2個用空格隔開的整數Xi、Yi,表示第i塊磚在Xi行、Yi列的位置。
輸出
為可以消掉最多的磚塊數。
輸入輸出樣例
輸入
5 10 11
2 1
4 6
4 9
3 9
9 7
9 9
7 9
8 10
8 8
8 6
10 2
輸出
6
樣例解釋
站在第4行、6列的位置,可以消除6個方塊。
資料範圍
n<=m; k<=m*m
60%:n<=70; m<=70; k<=4900
100%:n<=1000; m<=1000; k<=1000000
解題思路
先讀入每一個磚的位置,再算字首和,最後直接用當前列的字首和減去範圍以外的字首和,再加起來,就能算出答案。
程式碼
#include<iostream>
#include<cstdio>
using namespace std;
int m,k,n,a[1001][1001],maxn=0;
int main()
{
int x,y;
scanf("%d%d%d",&n,&m, &k);
for (int i=1;i<=k;i++)
scanf("%d%d",&x,&y),a[x][y]=1;//讀入,每讀入一個就在相應位置標記一下
for (int i=1;i<=m;i++)
for (int j=1;j<=m;j++
)
a[i][j]+=a[i-1][j];//計算字首和
for (int i=1;i<=m-n+1;i++)
for (int j=1;j<=m-n+1;j++)
{
int sum=0;
for (int k=j;k<=j+n-1; k++)
{
sum+=a[i+n-1][k]-a[i-1][k];//計運算元矩陣中每一列的字首和並加起來
if (sum>maxn) maxn=sum;//求最大值
}
}
printf("%d",maxn);
}