对于每一个r,我们计算从i到j的和,这里可以直接用前缀和计算,加入到我们的最大和sum中,当sum大于k时,我们就把l右移,直到sum小于k,每一次就都可以记录答案,答案数量为r-l+1,为什么是这个呢?,其实是从r往前计算的,r,r->r-1,r->r-2,....,r->l,总共r-l+1个区间和都是小于k的,也可以理解为从l出发到r,答案一样,只不过对于过程理解不一样而已
#include<iostream>
using namespace std;
typedef long long LL;
int arr[510][510];
int main()
{
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
cin>>arr[i][j];
arr[i][j]+=arr[i-1][j];
}
LL ans=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
for(int l=1,r=1,p=0;r<=m;r++)
{
p+=arr[j][r]-arr[i-1][r];
while(p>k)
{
p-=arr[j][l]-arr[i-1][l];
l++;
}
ans+=r-l+1;
}
cout<<ans<<endl;
return 0;
}