Python:统计子矩阵(前缀和、尺取法)

2023-11-05

问题描述

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

输入格式

第一行包含三个整数 N,M 和 K.

之后 N 行每行包含 M 个整数, 代表矩阵 A.

输出格式

一个整数代表答案。

样例输入

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

样例输出

19

参考代码:

(暴力法只能通过30%测试)

N,M,K=map(int,input().split())
a=[[0] for i in range(N)]
a.insert(0,[0]*(M+1))
for i in range(1,N+1):  #从a[1]1[1]开始读矩阵
  a[i].extend(map(int,input().split()))
ans=0
for i1 in range(1,N+1):
  for i2 in range(i1,N+1):
    for j1 in range(1,M+1):
      for j2 in range(j1,M+1):
        sum=0
        for i in range(i1,i2+1):
          for j in range(j1,j2+1):
           sum+=a[i][j] 
        if sum<=K:    #当和不超过 K 时,ans + 1
          ans+=1
print(ans)   

 方法二:前缀和、尺取法

n,m,k=map(int,input().split())
a=[[0] for i in range(n)]   # 0 行全为 0
a.insert(0,[0]*(m+1))      #insert将[0]*(m+1)添加到a[0]
for i in range(1,n+1):
  a[i].extend(map(int,input().split()))  #读入每一行矩阵
s=[[0]*(m+1) for i in range(n+1)]   #创建 n 行 m 列二维矩阵
for i in range(n+1):
  for j in range(m+1):
    s[i][j]=s[i-1][j]+a[i][j]  #求第 j 列第 i 行上数字的前缀和
ans=0
for i1 in range(1,n+1):    #暴力遍历行
  for i2 in range(i1,n+1): #暴力遍历行
    j1=1
    z=0
    for j2 in range(1,m+1):  #j2 列上,i1~i2的区间和。累加得到二维区间和
      z+=s[i2][j2]-s[i1-1][j2]
      while z>k:   #若区间和 > k,移动指针 j1
        z-=s[i2][j1]-s[i1-1][j1]  #后面指针前移
        j1+=1
      ans+=j2-j1+1 #若区间和小于 k
print(ans)

        矩阵的行子区间仍用暴力二重遍历

        只把列区间和用尺取法优化 

1:Python insert()方法

描述

insert() 函数用于将指定对象插入列表的指定位置。

语法

insert()方法语法:

list.insert(index, obj)

参数

  • index -- 对象 obj 需要插入的索引位置。
  • obj -- 要插入列表中的对象。

返回值

该方法没有返回值,但会在列表指定位置插入对象。

2:Python  extend()方法

描述

extend() 函数用于在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)。

语法

extend()方法语法:

list.extend(seq)

参数

  • seq -- 元素列表。

返回值

该方法没有返回值,但会在已存在的列表中添加新的列表内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python:统计子矩阵(前缀和、尺取法) 的相关文章

随机推荐

  • 【数据结构】数组

    1 计算一维数组存储地址 a i 公式 a i L a 起始地址 i 当前i个元素下标 L 每个元素所占字节 例 int a 10 已知a 1000 sizeof int 4 求a 3 地址 1000 3 4 1012 2 计算二维数组存储
  • SQL注入之时间盲注 和 报错注入(sql-lab第一关为例)

    什么是时间盲注 时间盲注指通过页面执行的时间来判断数据内容的注入方式 通常用于数据 包含逻辑型 不能返回到页面中的场景 无法利用页面回显判断数据内容 只能通过执行的时间来获取数据 时间盲注的过程 1 找到注入点 并选择合适的注入语句 2 爆
  • hexo搭建博客-butterfly主题详细版

    Hexo搭建博客 butterfly主题 前置知识 对于Github和Gitee的基本了解与使用 最关键的是你要知道github为什么访问的这么慢 如何魔法上网访问github 或者说不用魔法如何访问github 本文在可能遇到的问题说明了
  • c语言用串口读温度值,温度传感器与串口

    1 题目要求 有时候我们需要知道在一段时间里温度传感器测量的温度的历史数据 之前的温度传感器例程只是在液晶屏上实时显示出数据而已 并不能查看它的历史数据 所以我们运用之前所有学过的知识来完成这个任务 首先我们先从简单的理念入手 利用串口每隔
  • 数学推导+纯Python实现机器学习算法12:贝叶斯网络

    Python机器学习算法实现 Author louwill 在上一讲中 我们讲到了经典的朴素贝叶斯算法 朴素贝叶斯的一大特点
  • 计算机图形技术在游戏领域应用,计算机图形图像技术在美术领域中的应用

    摘 要 现如今科学技术日益发展的时代 图像的发展已经不能够满足人类的需求 它不只是表現人们视野中的影像 通过各个领域的先进的专业的软件和技术 能够更加成功的表现出来 计算机图形图像技术已经不断的实践在各个领域 下文是对其主要应用的分析研究
  • java iterable 使用_Iterable(迭代器)的用法

    一 前言 在开发中 经常使用的还是for each循环来遍历来Collection 不经常使用Iterable 迭代器 的 下面记录一下terable是一般用法 二 说明 迭代器是一种设计模式 它是一个对象 它可以遍历并选择序列中的对象 而
  • U盘提示格式化怎么办?3个方法轻松解决!

    我的u盘已经很久没用了 今天刚把u盘插入电脑就显示需要进行格式化 但是我还有很多重要的文件都保存在里面呢 这可怎么办呀 有什么方法恢复里面的数据吗 u盘是我们日常生活中常用的移动存储设备之一 但有时可能会遇到一个让人烦恼的问题 那就是当插入
  • TypeScript基础小课堂二

    上期简单的介绍了一下TS的安装和运行环境 现在正式进入知识点阶段 1 TS类型注解 TypeScript 是 JS 的超集 TS 提供了 JS 的所有功能 并且额外的增加了 类型系统 TS中定义变量 常量 可以指定类型 A类型的变量不能保存
  • Mysql Too many connections

    程序启动过程中 连接mysql异常 信息如下 Caused by com mysql cj exceptions CJException Data source rejected establishment of connection me
  • Android 开发简易失物招领二手交易平台

    一 开发环境 1 android studio 客户端 eclipes 服务端 2 java语言 二 效果展示 视频地址 https www bilibili com video BV1Ng4y1v7XC 三 客户端开发 1 首先设置mai
  • 交换机与路由器技术-37-端口安全

    目录 一 端口安全 1 1 课程引入 1 2 基本概念 1 3 作用 1 4交换机端口安全配置 1 4 1 配置最大活跃地址数量 1 4 2 配置静态MAC地址和接口绑定 1 4 3配置接口老化时间 1 4 4 配置MAC地址违规后的操作
  • 什么是微服务架构,有何优缺点?

    什么是微服务架构 通常而言 微服务架构是一种架构模式或者说是一种架构风格 它提倡将单一应用程序划分成一组小的服务 每个服务运行独立的自己的进程中 服务之间互相协调 互相配合 为用户提供最终价值 服务之间采用轻量级的通信机制互相沟通 通常是基
  • npm link的作用与使用

    1 npm link 使用场景 库包在开发或迭代后 不适合发布到线上进行调试 过程繁琐且会导致版本号膨胀 这个时候就可以通过npm link将包放入到node的安装目录下的node modules文件夹中 这样就可以直接使用包名直接在本地调
  • js 实时监听input中值变化 【转】

    文章出处 js 实时监听input中值变化 h1 h1
  • 弗洛伊德算法(floyd)

    弗洛伊德算法和迪杰斯特拉算法都是求两点之间最短路径的问题 弗洛伊德算法使用了动态规划的思想 用二维矩阵记录了所有点之间最短的距离 虽然代码只有几行 但是思想还很值得回味的 其主要的思想就是两个点之间的直接距离能否使用第三个点来缩短 公式 v
  • 看过来——用Python探索《红楼梦》的人物关系

    数据准备 红楼梦 txt 文件一份 金陵十二钗 贾宝玉 人物名称列表 宝玉 nr 黛玉 nr 宝钗 nr 湘云 nr 凤姐 nr 李纨 nr 元春 nr 迎春 nr 探春 nr 惜春 nr 妙玉 nr 巧姐 nr 秦氏 nr 该分列表是为了
  • SpringBoot Admin服务离线、不显示健康信息的问题

    SpringBoot Admin服务离线 不显示健康信息的问题 问题1 SpringBoot Admin服务一直离线 原因 解决方法 重启电脑 重新加载配置文件 问题2 数据显示不全 解决方法 问题1 SpringBoot Admin服务一
  • 进程篇----获取进程句柄(提权、打开)OpenProcess

    对目标进程提权 然后打开 提权的目的是为了防止当前进程的权限无法打开目标进程 获取句柄 BOOL EnableDebugPrivilege TRUE 代表需要提权 BOOL EnableDebugPrivilege FALSE 代表不需提权
  • Python:统计子矩阵(前缀和、尺取法)

    问题描述 给定一个 N M 的矩阵 A 请你统计有多少个子矩阵 最小 1 1 最大 N M 满足子矩阵中所有数的和不超过给定的整数 K 输入格式 第一行包含三个整数 N M 和 K 之后 N 行每行包含 M 个整数 代表矩阵 A 输出格式