12月要参加全国计算机能力挑战赛,所以去网上搜了题目做了一下,大致都是一些常规思路,有大佬有更好的方法还望指点一番。
题目
智能除草
农业植保无人机作为最新的设备,可以加注除草剂进行除草。每次工作可以喷洒边长为K的正方形区域。现有一块边长为N的正方形农田,将其分成N*N个方格单元,已知每个单元里的杂草数量。求该植保无人机一次工作最多可以除草的数量。
输入说明:
第一行是2个正整数,分别为N和K(1≤K≤N≤1000)。
之后N行N列正整数,表示每个单元中的杂草数量(不超过50)。
输出说明:
该植保无人机一次工作最多可以除草的数量。
输入样例:
5 2
2 2 1 1 1
1 2 1 5 6
6 1 1 4 5
2 6 1 1 1
1 1 1 1 1
输出样例:
20
按照最后一次提交的代码为评分标准。
思路:
这题是要求最大子矩阵的和,首先求各个点到(0,0)的矩阵面积,即为是s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i,j],再求k*k内的杂草数量,即为w[i][j]=s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k],w[i][j]的最大值就是答案。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N=1010;
int k;
int a[N][N],s[N][N],w[N][N];
int n;
int main()
{
cin>>n>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
int res=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
w[i][j]=s[i][j]-s[i-k][j]-s[i][j-k]+s[i-k][j-k];
res=max(w[i][j],res);
}
}
cout<<res;
return 0;
}