2741. 特别的排列

Powered by:NEFU AB-IN

Link

文章目录

  • 2741. 特别的排列
    • 题意
    • 思路
    • 代码

2741. 特别的排列

  • 题意

给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列:

对于 0 <= i < n - 1 的下标 i ,要么 nums[i] % nums[i+1] == 0 ,要么 nums[i+1] % nums[i] == 0 。
请你返回特别排列的总数目,由于答案可能很大,请将它对 10^9 + 7 取余 后返回。

2 <= nums.length <= 14
1 <= nums[i] <= 10^9

  • 思路

状态压缩+dfs+记忆化搜索

看到nums的长度并不长,考虑将状态压缩

  1. 类似全排列的思路(拿一个空数组,从左往右开始填数),一个包含 n 个不同整数的数组有 n! 种排列,如果直接dfs并判断是否是特别的排列,可能会超时。遂考虑将状态压缩为01串,0表示这个数并未选过,1表示这个数已经选过
  2. 举例子
    1. 例如数组 [2, 3, 6],如果状态为101,说明2和6被选过
    2. 考虑对dfs进行优化
      1. 在从左往右填数的过程中,维护在原数组的坐标,只需要考虑下一个数是否和前一个数构成因数关系即可
      2. 根据第一条的结论,我们就可以从一层一层的状态中过滤很多,保证下一层继承的上一层是正确的
      3. 考虑记忆化搜索,Python可以用@cache优化
    3. 状态转移:
      1. 维护两个值
        1. 一个是mask的01串,代表哪个数被选了,初始为0
        2. 一个是prev_index,代表前一个选的坐标是什么,初始为-1,代表是dfs时的第一个数,必选
      2. 类似全排列,查找 mask 中哪个没别选,如果这个数满足要求,那么下一个dp状态就是 dp(mask | (1 << i), i),即让这个mask的这一位置1,并且我们维护的前一个数的下标更改为i
    4. 最后当mask全为1时,则代表全选完了,而且是正确结果
  • 代码


'''
Author: NEFU AB-IN
Date: 2024-06-26 15:20:32
FilePath: \LeetCode\2741\2741.py
LastEditTime: 2024-06-26 20:34:10
'''
# import
from functools import cache
from sys import setrecursionlimit, stdin, stdout, exit
from collections import Counter, deque, defaultdict
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from bisect import bisect_left, bisect_right
from datetime import datetime, timedelta
from string import ascii_lowercase, ascii_uppercase
from math import log, gcd, sqrt, fabs, ceil, floor
from types import GeneratorType
from typing import TypeVar, List, Dict, Any, Callable# Data structure
class SA:def __init__(self, x, y):self.x = xself.y = ydef __lt__(self, other):return self.x < other.x# Constants
N = int(2e5 + 10)  # If using AR, modify accordingly
M = int(20)  # If using AR, modify accordingly
INF = int(2e9)
E = int(100)# Set recursion limit
setrecursionlimit(INF)# Read
input = lambda: stdin.readline().rstrip("\r\n")  # Remove when Mutiple data
read = lambda: map(int, input().split())
read_list = lambda: list(map(int, input().split()))# Func
class std:# Recursion@staticmethoddef bootstrap(f, stack=None):if stack is None:stack = []def wrappedfunc(*args, **kwargs):if stack:return f(*args, **kwargs)else:to = f(*args, **kwargs)while True:if isinstance(to, GeneratorType):stack.append(to)to = next(to)else:stack.pop()if not stack:breakto = stack[-1].send(to)return toreturn wrappedfuncletter_to_num = staticmethod(lambda x: ord(x.upper()) - 65)  # A -> 0num_to_letter = staticmethod(lambda x: ascii_uppercase[x])  # 0 -> Aarray = staticmethod(lambda x=0, size=N: [x] * size)array2d = staticmethod(lambda x=0, rows=N, cols=M: [std.array(x, cols) for _ in range(rows)])max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)filter = staticmethod(lambda func, iterable: list(filter(func, iterable)))# —————————————————————Division line ——————————————————————class Solution:def specialPerm(self, nums: List[int]) -> int:n = len(nums)all_mask = (1 << n) - 1MOD = int(1e9 + 7)@cachedef dp(mask, prev_index):if mask == all_mask:return 1total_perms = 0for i in range(n):if mask & (1 << i) == 0:if prev_index == -1 or nums[prev_index] % nums[i] == 0 or nums[i] % nums[prev_index] == 0:total_perms = (total_perms + dp(mask | (1 << i), i)) % MODreturn total_permsreturn dp(0, -1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35716.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计组--控制器--复习专用

文章目录 前言一、控制器概述CPU的基本功能 二、控制器的功能和组成1.功能2.组成3.时序系统及其控制4.单周期、多周期、流水线1.单周期2.多周期3.流水线 三、微程序控制器1.基本概念2.微指令格式 总结 前言 学无止境&#xff0c;笔勤不辍。今天笔者简单介绍一下有关控制器的知…

【会议征稿,IEEE出版】第三届机器人、人工智能与智能控制国际会议(RAIIC 2024,7月5-7)

第三届机器人、人工智能与智能控制国际会议&#xff08;RAIIC 2024&#xff09;将于2024年7月5-7日中国绵阳举行。 RAIIC 2024是汇聚业界和学术界的顶级论坛&#xff0c;会议将邀请国内外著名专家就以传播机器人、人工智能与智能控制领域的技术进步、研究成果和应用做专题报告…

网站推广如何做?这七个方法要知道

在出海独立站商家中&#xff0c;推广是必不可少的环节。在你完成网站的搭建&#xff0c;产品的上架&#xff0c;以及网站的运营和优化后&#xff0c;你就可以开始着手推广你的网站了。你的网站是承载你的品牌和产品的主要平台&#xff0c;因此&#xff0c;你需要根据你的品牌和…

OZON跨境卖家爆款产品有哪些

OZON跨境卖家爆款产品有哪些&#xff1f;国内的Ozon跨境卖家做这几个品&#xff0c;不爆都难&#xff01; Top1 太阳镜 Очки солнцезащитные 商品id&#xff1a;1556874194 月销量&#xff1a;1095 OZON跨境卖家爆款产品工具&#xff1a;D。DDqbt。COm/…

2024三掌柜赠书活动第二十五期:Rust 游戏开发实战

目录 目录 前言 Rust语言概念 关于《Rust 游戏开发实战》 Rust系统编程的核心点 Rust开发的关键技术和工具 内容简介 作者简介 书中前言/序言 内容介绍 《Rust 游戏开发实战》全书速览 图书目录 结束语 前言 技术圈最近的编程语言新秀当属Rust莫属&#xff0c;Rus…

Ubuntu下包管理命令dpkg安装deb软件包的示例与汇总

一、选定待安装的deb软件包&#xff1a; 二、dpkg安装chrome浏览器的示例&#xff1a; 三、汇总dpkg包管理命令格式&#xff1a;

高三学生的倒计时 给高考一个倒计时 让学习更有计划的进行

高三学生的压力是很大的&#xff0c;时间也是很紧迫&#xff0c;仅仅一年的时间&#xff0c;许多人都觉得不够用&#xff0c;为了让学子们更有时间紧迫感&#xff0c;更清晰的掌握时间&#xff0c;我们需要一个准确提醒的倒计时效果。 把这个倒计时放到班级电脑上&#xff0c;是…

【人工智能】—基于线性回归和多项式回归模型预测人均收入的研究

引言 随着人工智能技术的飞速发展&#xff0c;机器学习已成为数据分析和预测领域的重要工具。在众多机器学习算法中&#xff0c;线性回归和多项式回归因其模型简单、易于理解和实现而受到广泛应用。本文旨在探讨如何利用这两种回归模型对人均收入进行预测。线性回归模型以其简…

探索顺序结构:栈的实现方式

&#x1f511;&#x1f511;博客主页&#xff1a;阿客不是客 &#x1f353;&#x1f353;系列专栏&#xff1a;渐入佳境之数据结构与算法 欢迎来到泊舟小课堂 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 ​​ 一、栈的定义 栈&#xff08;Stack&#xf…

项目管理心得

1.项目生命周及变更许可 ①项目早期&#xff1a;早期原则上应该更倾向于接受变动&#xff08;让怎么干就怎么干 - 接受变更&#xff09;&#xff0c;当然也要遵守变更控制程序。 ②项目中期&#xff1a;先要分析变更的影响&#xff0c;原则上尽可能与相关人员沟通&#xff0c…

SUSE Linux 15 sp5上Nginx安装配置升级

1.安装SUSE linux 15 SP5 图形化界面安装很简单&#xff0c;选择最小安装&#xff0c;安装好后&#xff0c;使用vim编辑配置文件&#xff0c;结果提示"bash: vim: command not found"。 最简安装把一些常用命令都整没有了&#xff0c;于是又重新选择了Server Applica…

(四十三)Vue Router之嵌套路由

文章目录 什么是嵌套路由嵌套路由的使用demo 上一篇&#xff1a;&#xff08;四十二&#xff09;Vue之路由及其基本使用Vue Router 下一篇&#xff1a;&#xff08;四十四&#xff09;Vue Router的命名路由和路由组件传参 什么是嵌套路由 实际生活中的应用界面&#xff0c;有…

服务器部署与DDOS攻防

知识点&#xff1a;DHPC与Web服务部署&#xff0c;DHCPig攻防&#xff0c;SYN Flooding测试 DHCP&#xff1a; 能够自动为客户机获取IP等参数 DHCP是动态主机配置协议&#xff08;Dynamic Host Configuration Protocol&#xff09;的缩写&#xff0c;它是一种网络管理协议&am…

epoch和batch的区别

在机器学习和深度学习中&#xff0c;“epoch”&#xff08;批次&#xff09;和"batch"&#xff08;批量&#xff09;是两个重要的概念&#xff0c;它们分别表示训练过程中的不同阶段和数据处理方式。 Epoch&#xff08;批次&#xff09; 定义&#xff1a;Epoch&…

935.骑士拨号器 - 力扣

935.骑士拨号器 - 力扣 题目链接&#xff1a;935. 骑士拨号器 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 示例 1&#xff1a; 输入&#xff1a;n 1 输出&#xff1a;10 解释&#xff1a;我们需要拨一个长度为1的数字&#xff0c;所以把骑士放在10个单元格中…

Spring AI 调用 openAI 进行语音朗读(文本转语音,TTS)

项目搭建&#xff1a; 参考 Spring AI 介绍以及与 Spring Boot 项目整合 编写 Controller 接口 创建一个 Controller 类&#xff0c;例如 TranscriptionController。在该类中&#xff0c;注入 Resource。编写一个接口&#xff0c;例如 //&#xff0c;用于处理语音转录请求。…

多接口分线盒在工业自动化中的重要性与应用

简介 多接口分线盒是现代工业自动化中不可或缺的一个组成部分&#xff0c;它主要用于简化复杂的接线系统&#xff0c;提高效率和可靠性。本文将详细探讨多接口分线盒的定义、功能、以及在工业自动化中的应用情况。 无源多接口分线盒 多接口分线盒的定义与功能 多接口分线盒是…

qt文件断点续传+nodejs搭建本地服务器

文章目录 nodejs服务器搭建qt代码 用nodjs来搭建一个本地的服务器&#xff0c;用qt编写程序实现文件的上传和断点续传的功能 nodejs服务器搭建 先去安装一个nodejs&#xff0c;然后在文件夹中npm init -y初始化nodejs项目,npm install express multer安装所需要的包&#xff…

嵌入式工程师从0开始,到底该学什么,怎么学

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;嵌入式是个大筐&#xff0…