问题描述
输入格式
第一行包含三个整数 N,M 和 K.
之后 N 行每行包含 M 个整数, 代表矩阵 A.
输出格式
一个整数代表答案。
样例输入
样例输出
样例说明
运行限制
最大运行时间:1s
最大运行内存: 256M
源码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class 统计子矩阵 {
static int N=510;
static int[][] a=new int[N][N];
static int[][] s=new int[N][N];
static int n,m,k;
static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
public static void main(String[] args) throws IOException {
String[] ts=br.readLine().split(" ");
n=Integer.parseInt(ts[0]);
m=Integer.parseInt(ts[1]);
k=Integer.parseInt(ts[2]);
for (int i = 1; i <= n; i++) {
ts=br.readLine().split(" ");
for (int j = 1; j <= m; j++) {
a[i][j]=Integer.parseInt(ts[j-1]);
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
//res long r和l都是int
long res=0;
//枚举上下的边
//使用双指针
for (int x1 = 1; x1 <= n; x1++) {
for (int x2 = x1; x2 <= n; x2++) {
//枚举l和r
int l=1;
int r=1;
while(r<=m) {
while(l<=r && !check(x1,l,x2,r)) l++;
res+=(long)r-l+1;
r++;
}
}
}
System.out.println(res);
}
private static boolean check(int x1, int y1, int x2, int y2) {
return s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<=k;
}
}
这里res+=(long)r-l+1的意思是 矩阵的右边界为r的情况下符合要求的矩阵个数
l最多可以移动r-l次,加上本来的l自己的位置