时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
现在给出一个正方形地图,其边长为n,地图上有的地方是空的,有的地方会有敌人。
我们现在有一次轰炸敌人的机会,轰炸敌人的区域是一个k*k的正方形区域,现在需要你解决的问题就是计算最多轰炸的敌人数量是多少。
输入描述:
本题包含多组数据,每组数据第一行输入两个数n,k。
接下来n行,每行n个数字,表示这个点上的敌人数量。
数据范围:
1<=n<=50
1<=k<=n
每个点上的敌人数量不超过100个(0<=a[i][j]<=100)。
输出描述:
每组数据输出包含一行,表示计算的结果。
示例1
输入
4 2 1 1 0 0 1 1 0 0 0 0 2 2 0 0 2 2
输出
8
说明
样例中,显然轰炸右下角那个部分能够击败最多的敌人
分析:预处理每行,然后快速求和。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int map[100][100]; 5 int main() 6 { 7 int N,k; 8 while(scanf("%d%d",&N,&k)!=EOF) 9 { 10 for(int i=1;i<=N;i++) 11 for(int j=1;j<=N;j++) 12 { 13 scanf("%d",&map[i][j]); 14 map[i][j]+=map[i][j-1];//map[i][j]表示第i行第1个数到第j个数的和 15 } 16 int ans=0; 17 for(int i=1;i<=N;i++) 18 { 19 for(int j=1;j<=N;j++) 20 { 21 int num=k,temp=0; 22 for(int p=i;p<=N&#p++) 23 { 24 num--; 25 if(j+k>N) temp+=map[p][N]-map[p][j-1]; 26 else 27 temp+=map[p][j+k-1]-map[p][j-1]; 28 } 29 ans=ans>temp?ans:temp; 30 } 31 } 32 printf("%d ",ans); 33 } 34 return 0; 35 }