2036: [蓝桥杯2022初赛] 统计子矩阵(二维前缀和,一维前缀和)

您所在的位置:网站首页 m×n矩阵和n×m矩阵 2036: [蓝桥杯2022初赛] 统计子矩阵(二维前缀和,一维前缀和)

2036: [蓝桥杯2022初赛] 统计子矩阵(二维前缀和,一维前缀和)

2024-07-03 00:42| 来源: 网络整理| 查看: 265

2036: [蓝桥杯2022初赛] 统计子矩阵

内存限制:256 MB 时间限制:1 S 标准输入输出

题目类型:传统 评测方式:文本比较 上传者:外部导入

提交:310 通过:74

题目描述

给定一个 N × M 的矩阵A,请你统计有多少个子矩阵(最小 1 × 1,最大 N × M) 满足: 子矩阵中所有数的和不超过给定的整数K?

输入格式

第一行包含三个整数N, M 和K. 之后 N 行每行包含 M 个整数,代表矩阵A. 30%的测试数据:1≤N,M≤20; 70%的测试数据:1≤N,M≤100; 100%的测试数据:1≤N,M≤500;0≤Aij≤1000;1≤K≤250000000。

输出格式

一个整数代表答案。

输入样例 复制

3 4 10 1 2 3 4 5 6 7 8 9 10 11 12

输出样例 复制

19

数据范围与提示

满足条件的子矩阵一共有19,包含: 大小为1 × 1 的有10 个。 大小为1 × 2 的有3 个。 大小为1 × 3 的有2 个。 大小为1 × 4 的有1 个。 大小为2 × 1 的有3 个。

可笑的是,第一次看到这个题,写了一个六层循环,吓死人!

对于这种二维矩阵,求和,可以用dp[i][j]来表示matr[0][0]到matr[i][j]的和,    这样能简便后面求和的步骤,减少两阶的时间复杂度,这是二维前缀和。

   同时,一维前缀和怎么表示呢?dp[i][j]表示matr[0][j]到matr[i][j]的和,这只表示    第j列前面i行的和。所以这就是一维前缀和和二位前缀和的区别

对于递增的二维前缀和,如果要计算子矩阵个数等问题,可以先固定行号,再迭代列号进行遍历,这样可以根据递增的性质减少时间复杂度,实现三重循环。因为如果先固定左上角坐标,再固定右下角坐标,则会出现四重循环,即不能利用二维前缀和递增的性质。

/**对于这种二维矩阵,求和,可以用dp[i][j]来表示matr[0][0]到matr[i][j]的和, 这样能简便后面求和的步骤,减少两阶的时间复杂度,这是二维前缀和。 同时,一维前缀和怎么表示呢?dp[i][j]表示matr[0][j]到matr[i][j]的和,这只表示 第j列前面i行的和。所以这就是一维前缀和和二位前缀和的区别 */ /**二维前缀和求解*/ #include #include #include using namespace std; int dp[502][502]={0}; int main() { memset(dp,0,sizeof(dp)); int n,m,top; scanf("%d%d%d",&n,&m,&top); int val; for(int i=1;i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3