【DP】ssl 2315.打砖块

题目描述

KXT是一个很无聊的小朋友,一天到晚都在打坐…
  一天,被他发现了一个比打坐更无聊的事情——打砖块。很多块砖分布在一个mm的矩阵中,他可以消掉以他为左上角顶点的一个nn的矩阵里的所有砖块。
  喜欢偷懒的他请来了你帮他计算可以消掉最多的砖块数(只能消一次)。

>Input

第一行:用空格隔开的三个整数n、m、k。
  接下来k行,每行2个用空格隔开的整数Xi、Yi,表示第i块砖在Xi行、Yi列的位置。

>Output

为可以消掉最多的砖块数。

>Sample Input

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

>Sample Output

6

【样例解释】

站在第4行、6列的位置,可以消除6个方块。
  【DP】ssl 2315.打砖块_第1张图片

【数据范围】

n<=m; k<=m*m
60%:n<=70; m<=70; k<=4900
100%:n<=1000; m<=1000; k<=1000000;

思路

吐槽:啊啊啊好容易超时啊啊啊
DP,由最大子矩阵之和改过来的

代码

#include
int n,m,s,ans,k,a[1001][1001]={0};
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=k;i++){
		scanf("%d%d",&s,&ans);
		a[s][ans]=1; 
	}
	for(int i=1;i<=m;i++)
	  for(int j=1;j<=m;j++)
	    a[i][j]+=a[i][j-1];
	ans=0;
	for(int i=n;i<=m;i++) 
	  for(int j=n;j<=m;j++){
	  	s=0;
	  	for(k=i-n+1;k<=i;k++)
		   s+=a[k][j]-a[k][j-n];
	  	if(s>ans) ans=s;
	  }
	printf("%d",ans);
	return 0;
}

你可能感兴趣的:(DP)