第13届蓝桥杯--统计子矩阵C++

 题目如上,很明显,这题需要用到二维前缀和,由于子矩阵的大小未知,所以如果用暴力枚举四个边界(上下左右),时间复杂度就为O(n^4),一定会超时,所以要想一个方法降低时间复杂度,这题我们可以用双指针

1、先设置两个变量 i,j 分别枚举左右边界

2、设置两个指针start和end枚举上下边界,其中start为慢指针,end为快指针(start<=end)

3、如果得到的子矩阵中的数的和大于k,则慢指针start前进,这样子矩阵的和就一定不会增加了

4、直到子矩阵的和小于等于k,start不再前进了,此时的宽度为j-i+1的子矩阵个数为end-start+1,如果start>end,就不做操作,直接进入下一层循环

对于第4步,下面说几个比较难理解的点:

1、为什么是end-start+1个呢?这些子矩阵的宽度是固定的,关键是长度,长度分别为1,2,...,end-start+1(上下边界也分别为一行),所以一共有end-start+1个子矩阵

2、为什么只占一行的矩阵不算进去呢?,因为在i,j固定的时候,我们枚举的是end,每一次end都会往下走,而start会保持在当前的位置,如果下一行满足的话,在循环中的后面就会把从该子矩阵第二行开始的只占一行的子矩阵算在内了,如果我们现在就算的话,就会重复计算了

 C++代码如下:

#include<iostream>
using namespace std;
const int N=510;
int a[N][N];
int n,m,k;
int main(){
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
            a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];//计算前缀和
        }
    long long sum=0;//个数可能会爆int,所以用long long存储
    for(int i=1;i<=m;i++)
        for(int j=i;j<=m;j++){
            for(int st=1,ed=1;ed<=n;ed++){
                //子矩阵坐标为:左上(st,i),左下(ed,i),右上(st,j),右下(ed,j)
                while(st<=ed&&a[ed][j]-a[ed][i-1]-a[st-1][j]+a[st-1][i-1]>k)st++;
                if(st<=ed)sum+=ed-st+1;
            }
        }
    printf("%lld\n",sum);
    return 0;
}

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
蓝桥杯统计矩阵c问题是一个经典的算法问题,可以通过编程实现。下面我将用300字中文回答如何实现。 我们可以使用二维前缀和的方法来解决这个问题。首先,我们定义一个二维数组prefixSum,用来存储原始矩阵a中每个位置(i,j)之前所有元素的和。 我们可以通过以下方式计算prefixSum: 1. 遍历矩阵a的每个位置(i,j),计算prefixSum[i][j]: - 如果i=0且j=0,则prefixSum[i][j] = a[i][j]; - 如果i=0且j≠0,则prefixSum[i][j] = prefixSum[i][j-1] + a[i][j]; - 如果i≠0且j=0,则prefixSum[i][j] = prefixSum[i-1][j] + a[i][j]; - 如果i≠0且j≠0,则prefixSum[i][j] = prefixSum[i-1][j] + prefixSum[i][j-1] - prefixSum[i-1][j-1] + a[i][j]。 2. 接下来,我们可以通过计算prefixSum来统计矩阵c的和。对于每个矩阵c,我们可以使用以下方式计算其和: - 定义矩阵c的左上角位置为(i1, j1),右下角位置为(i2, j2); - 如果(i1, j1)为原始矩阵a的左上角,则c的和为prefixSum[i2][j2]; - 如果(i1, j1)为原始矩阵a的第一行,则c的和为prefixSum[i2][j2] - prefixSum[i2][j1-1]; - 如果(i1, j1)为原始矩阵a的第一列,则c的和为prefixSum[i2][j2] - prefixSum[i1-1][j2]; - 其他情况下,c的和为prefixSum[i2][j2] - prefixSum[i1-1][j2] - prefixSum[i2][j1-1] + prefixSum[i1-1][j1-1]。 通过以上的方法,我们可以编写代码来实现这个算法。代码的时间复杂度为O(M*N),其中M和N分别为原始矩阵a的行数和列数。因此,我们可以通过这个方法高效地解决蓝桥杯统计矩阵c问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值