题目:
思路:
我只想到暴力,但内存超限
双指针可做
先记录每一行数据到某列的和
把二维数据转化为一维,也就是把几列数据当作一列,然后用双指针,从这列的第一个数据往后累加,直到数据和大于k,从这列的第二个数据往后累加.........
看这个视频:统计子矩阵
代码:
#include<iostream>
#include<string>
using namespace std;
int n,m,k;
long long sum;
long long ans;
int a[510][510];
int b[510][510];
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
b[i][j]=b[i][j-1]+a[i][j];
}
}
for(int j1=1;j1<=m;j1++){
for(int j2=j1;j2<=m;j2++){//限制列
int i2=1; sum=b[1][j2]-b[1][j1-1];
for(int i=1;i<=n;i++){
while(sum<=k&&i2<=n){
i2++;
sum+=b[i2][j2]-b[i2][j1-1];
}
ans+=i2-i;
sum-=b[i][j2]-b[i][j1-1];
}
}
}
cout<<ans;
return 0;
}