问题描述
给定一个NXM的矩A请你统计有多少个子矩阵(最小1x1最大M)满足子矩阵中所有数的和不超过给定的数K?
输入格式
第一行包含三个整数N,M和K
之后N行每行包含M个整数代表矩阵A
输出格式
个整数代表答案
样例输入
3 4 10
1 2 34
5 6 7 8
9 10 11 12
样例输出
19
- import os
- import sys
-
- # 请在此输入您的代码
- n,m,k=map(int,input().split())
- s=[[0 for i in range(m+1)]] #构建二维列表
-
- for i in range(1,n+1):
- s.append([0]+list(map(int,input().split()))) #[0,1,2,3,4]
- for j in range(1,m+1):
- s[i][j]+=s[i-1][j] #求每列的累加和更新到每列上去
-
- ans=0
- for i in range(1,n+1):#确定上边界 ,如i=1,第一行
- for j in range(i,n+1): #确定下边界,j=2,3,4...,第三行,可求这三行中的矩阵
- l=1 #左边界
- sum=0
- for r in range(1,m+1): #遍历每一列
- sum+=s[j][r]-s[i-1][r] #i-1是因为第一行全是0,也避免i,j都等1的情况,因为s已经求累加,二者相减求得矩阵中所有数和
- while sum>k:
- sum-=s[j][l]-s[i-1][l] #减去左边得和
- l+=1 #超过k的话更新左边界,缩小矩阵左边大小,使矩阵继续向右边扩大
- ans+=r-l+1 #从1到3,3-1+1=3
-
- print(ans)
由于时间限制问题,只能通过70%