对你的进步没什么帮助的废话: 今天学习了前缀和与差分及类似物在一天的结束之时做了这么一道题给我WA哭了 作文以祭之
题意:
据说有一个N*M
的二维数组,你需要在这数组中找一个C*C
的正方形使得正方形中的数的和最大,输出这个正方形左上角的点的坐标
分析:
使用技能二维前缀和来解此题
设tab[i][j]
为以i,j为右下角,1,1为左上角的矩形中数的和
那么我们画个图分析一波得:
tab[i][j]=tab[i][j]+tab[i-1][j]+tab[i][j-1]-tab[i-1][j-1];
有了这个我们就可以切掉此题了 哇(WA)好简单啊(我卡我自己)
不在水题上出点问题我还配做蒟蒻吗
直接看代码吧
代码
#include<iostream>
#define ll long long
#define NN 1005
using namespace std;
ll n,m,c,sum=-99999999999,xx,yy;
ll tab[NN][NN];
int main(){
cin>>n>>m>>c;
for(ll i=1;i<=n;i++)
for(ll j=1;j<=m;j++){
cin>>tab[i][j];
tab[i][j]=tab[i][j]+tab[i-1][j]+tab[i][j-1]-tab[i-1][j-1];
}
for(ll i=1;i<=n;i++){
for(ll j=1;j<=n;j++){
ll u=i+c-1,o=j+c-1;
if(u>n||o>m) continue;//WA在这了 忘加=>崩盘
if(tab[u][o]-tab[u][j-1]-tab[i-1][o]+tab[i-1][j-1]>sum){
sum=tab[u][o]-tab[u][j-1]-tab[i-1][o]+tab[i-1][j-1];
xx=j;yy=i;
}
}
}
cout<<yy<<" "<<xx;
return 0;
}