1. 程式人生 > >【DP】2014年東莞市小學生程式設計複賽試題 打磚塊

【DP】2014年東莞市小學生程式設計複賽試題 打磚塊

題目

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); }