当前位置: 首页 > news >正文

【QED】爱丽丝与混沌的无尽海

文章目录

  • 题目
    • 题目描述
    • 输入输出格式
    • 数据范围
    • 测试样例
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度

题目

题目链接🔗

题目描述

在这里插入图片描述

如图所示,爱丽丝在一个3x3的迷宫之中,每个方格中标有 1 − 9 1-9 19各不相同的数字,爱丽丝可以从一格出发,到达任意相邻的格子。每到达一个格子,爱丽丝便获得了该格子上的数字,假设爱丽丝以 1 → 3 → 5 1\to3\to5 135 的顺序走过格子,她就获得了 135,长度为3的字符串。爱丽丝可能从任意一格出发,请你计算长度为 n n n 的字符串一共有多少种可能性。答案可能很大,最终答案请对 998244353 998244353 998244353 取模
注:不完全相同的两个字符串为两种不同的可能性,如 135139135131
同一格子可以重复走过。

输入输出格式

【输入格式】

4 4 4
1 1 1行到第 3 3 3行,每行 3 3 3个用空格分隔开的数字 a i j ( 1 ≤ a i j ≤ 9 ) a_{ij} (1 \le a_{ij} \le 9) aij(1aij9),代表第 i i i行第 j j j列格子上的数字。

4 4 4行输入一个数字 n n n,表示字符串的长度。

【输出格式】

1 1 1
输出长度为 n n n 的字符串的所有可能性对 998244353 998244353 998244353 的模数。

数据范围

1 ≤ a i j ≤ 9 1 \le a_{ij} \le 9 1aij9
1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105

测试样例

input1:

1 2 3
4 5 6
7 8 9
2

output1:

24

input2:

3 2 1
9 8 7
4 5 6
100000

output2:

528035646

思路

题目给定了9个数字之间相互不一样,则具体是什么数字已经不重要了,题目化简为:具体来说,给定一个 3x3 的迷宫,每个格子都可以作为起点,爱丽丝可以从一个格子出发,按照某种规则在相邻格子中移动,经过 n 步后最终到达其他格子。计算所有这样的路径的数量,并输出结果。
我们可以用一个三维数组,用来存储从某个位置 (x, y) 出发,经过 n 步后可以到达的路径数量。结果需要对这个质数取模。
计算的过程中可以使用深度优先搜索递归计算从迷宫中的某个格子出发,经过 n 步后能到达的所有路径的数量,由于数据量较大,可以采用记忆化搜索来避免重复计算,从而提高效率。
递归思路如下:

  1. 递归定义:
    函数 dfs(x, y, n) 计算从 (x, y) 这个位置出发,经过 n 步可以达到的所有可能路径的数量。
  2. 递归边界条件:
    当 n == 1 时,表示路径的长度为 1,起点本身就是一个有效路径。因此,dfs(x, y, 1) 直接返回 1,表示当前位置的路径数量为 1。
  3. 递归转移:
    对于每个 (x, y) 格子,函数会检查该格子周围的 8 个相邻格子(上下左右以及四个对角线方向的格子)。对于每一个相邻格子 (i, j),如果它与当前位置 (x, y) 相邻,即 abs(i-x) + abs(j-y) == 1,那么递归地调用 dfs(i, j, n-1) 来计算从该相邻格子出发,经过 n-1 步能到达的路径数量。
    然后将所有这些相邻格子的结果加起来,得到当前位置 (x, y) 出发,经过 n 步的路径总数。
  4. 记忆化搜索:
    mem[x][y][n] 用来记录已经计算过的结果,避免重复计算。如果 mem[x][y][n] 不为 0,表示该状态已经计算过,直接返回该结果。这大大提高了效率,因为同一个状态(从某个位置出发,经过相同步数)不会被重复计算。
  5. 递归的返回值:
    每次递归的结果是将相邻格子通过递归计算得到的路径数量进行累加,并对 998244353 取模,以确保结果不会超过整数范围。

代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using ld=long double;
constexpr int p=998244353;ll mem[5][5][100005];
ll dfs(int x, int y, int n)
{if(mem[x][y][n]!=0)return mem[x][y][n];if(n==1)return mem[x][y][n]=1;ll res=0;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)if(abs(i-x)+abs(j-y)==1)res = (res + dfs(i, j, n-1)) % p;return mem[x][y][n] = res;
}int main()
{int n;for(int i=0;i<=9;i++)cin>>n;ll ans=0;for(int i=1;i<=3;i++)for(int j=1;j<=3;j++)ans=(ans+dfs(i,j,n))%p;cout<<ans;return 0;
}

复杂度分析

时间复杂度

  1. 递归调用:
    递归函数 d f s ( x , y , n ) dfs(x, y, n) dfs(x,y,n) 的目的是计算从位置 ( x , y ) (x, y) (x,y) 出发,经过 n n n 步能够到达的所有路径数量。对于每个位置 ( x , y ) (x, y) (x,y),递归需要访问它的相邻格子(最多有 4 4 4 个相邻格子),并进行递归调用。
    因此,每次递归都会对最多 4 4 4 个相邻格子进行递归调用。

  2. 记忆化搜索:
    通过记忆化数组 m e m [ x ] [ y ] [ n ] mem[x][y][n] mem[x][y][n] 来避免重复计算,如果某个 ( x , y , n ) (x, y, n) (x,y,n) 状态已经计算过,直接返回已存储的结果。这意味着每个状态只会计算一次,从而避免了指数级的重复计算。

  3. 递归的状态数:
    递归的状态由 $(x, y) $和 n n n 决定。由于迷宫的大小是固定的 ( 3 ∗ 3 ) (3*3) 33,因此有 9 个可能的 ( x , y ) (x, y) (x,y) 位置。
    对于每个位置, n n n 可以从 1 1 1 到给定的最大步数 n n n 进行递归。因此,递归的状态数为:
    状态数 = 9 × n 状态数=9×n 状态数=9×n其中, 9 9 9 ( x , y ) (x, y) (x,y) 的取值范围, n n n 是步数的最大值。

  4. 每次递归的工作量:
    每次递归需要遍历最多 4 4 4 个相邻格子,并对每个相邻格子进行递归调用。这部分的计算量是常数级别的 O ( 1 ) O(1) O(1)
    综上,时间复杂度可以表示为:

时间复杂度 = O ( 9 × n 4 ) = O ( 36 n ) 时间复杂度=O(9×n4)=O(36n) 时间复杂度=O(9×n4)=O(36n)
由于常数项 36 36 36 可以忽略不计,最终的时间复杂度为:
O ( n ) O(n) O(n)

空间复杂度

  1. 记忆化数组:
    记忆化数组 m e m [ x ] [ y ] [ n ] mem[x][y][n] mem[x][y][n] 用于存储每个位置 ( x , y ) (x, y) (x,y) 和步数 n n n 的计算结果。因为 ( x , y ) (x, y) (x,y) 的位置有 9 9 9 个,而步数 n n n 最大为给定的 n n n,所以数组的大小为:
    m e m 数组的大小 = 9 × n mem 数组的大小=9×n mem数组的大小=9×n
  2. 递归栈空间:
    递归的最大深度为 n n n(因为递归每次调用时,步数 n n n 1 1 1)。因此,递归栈的空间复杂度为 O ( n ) O(n) O(n)

综上,空间复杂度为:
空间复杂度 = O ( 9 × n + n ) = O ( n ) 空间复杂度=O(9×n+n)=O(n) 空间复杂度=O(9×n+n)=O(n)

相关文章:

【QED】爱丽丝与混沌的无尽海

文章目录 题目题目描述输入输出格式数据范围测试样例 思路代码复杂度分析时间复杂度空间复杂度 题目 题目链接&#x1f517; 题目描述 如图所示&#xff0c;爱丽丝在一个3x3的迷宫之中&#xff0c;每个方格中标有 1 − 9 1-9 1−9各不相同的数字&#xff0c;爱丽丝可以从一格…...

IO模型学习

背景知识 Socket 套接字。 客户端和服务端通信时&#xff0c;客户端需要数据出口&#xff0c;服务端需要数据入口&#xff0c;这两个出入口就是Socket。数据接收方新建socket后需要绑定ip和端口号&#xff0c;这样客户端才能链接上socket。连接的过程就是 三次握手 FD file …...

Doxygen 使用指南

Doxygen 是一个文档生成工具&#xff0c;可以从源代码中的注释生成高质量的文档&#xff0c;支持多种编程语言&#xff08;如 C/C、Python、Java 等&#xff09;。以下是 Doxygen 的基本使用方法。 1. 安装 Doxygen 1.1 下载 Doxygen 访问 Doxygen 官网。根据操作系统选择合适…...

设计模式与游戏完美开发(2)

更多内容可以浏览本人博客&#xff1a;https://azureblog.cn/ &#x1f60a; 该文章主主题内容均来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第四章 游戏主要类——外观模式&#xff08;Facade&#xff09; 一、游戏子功能的整合 一个游戏程序常常由内部数个不…...

Coroutine 基础三 —— 结构化并发(二)

1、协程的结构化异常管理 如果一个协程抛异常&#xff0c;它所在的整个协程树上的其他协程&#xff08;向上是父协程到根协程&#xff0c;向下是所有后代协程&#xff09;都会被取消。因此协程发生异常的后果是十分严重的。 先讲原理&#xff0c;再说解决方案。 协程异常的处…...

GXUOJ-算法-第一次作业

1.整数划分 问题描述 GXUOJ | 整数划分 题解 #include<bits/stdc.h> using namespace std; const int N1010,mod1e97;int n; int f[N];int main(){cin>>n;f[0]1;for(int i1;i<n;i){for(int ji;j<n;j){f[j](f[j]f[j-i])%mod;}}cout<<f[n]; } 2.汉诺塔…...

Springboot项目Druid运行时动态连接多数据源的功能

项目支持多数据库连接是个很常见的需求&#xff0c;这不仅是要在编译前连已经知道的多个数据库&#xff0c;有时还要在程序运行时连后期增加的多个数据源来获得数据。 一、编译前注册数据库连接 1.引入依赖包 <!-- springboot 3.x --><dependency><groupId&g…...

字符串匹配——KMP算法

前言 刷到字符串匹配的力扣题了【28. 实现 strStr() 】&#xff0c;这题简单吧用库函数做就可以&#xff0c;说难吧&#xff0c;就得引出大名鼎鼎的线性匹配算法——KMP。 目录 KMP 算法背景与原理算法优势 前缀表1. 构建Next数组2. 搜索匹配 KMP 算法背景与原理 KMP&#x…...

Qt开发技术【下拉复选框 MultiSelectComboBox 自定义全选项】

继承ComboBox完成下拉复选框 自定义全选项 效果图 整个控件继承于QCombobox类。主要修改QLineEdit、QListWidget这两部分&#xff0c;QComboBox提供如下接口&#xff0c;可以将这两部分设置为新建的QLineEdit、QListWidget对象 CMultiSelectComboBox::CMultiSelectComboBo…...

20_HTML5 SSE --[HTML5 API 学习之旅]

HTML5 Server-Sent Events (SSE) 是一种技术&#xff0c;它允许服务器向浏览器推送更新。与传统的轮询不同&#xff0c;SSE提供了真正的单向实时通信通道&#xff1a;服务器可以主动发送数据到客户端&#xff0c;而不需要客户端发起请求。这对于实现实时更新的应用非常有用&…...

jetson Orin nx + yolov8 TensorRT 加速量化 环境配置

参考【Jetson】Jetson Orin NX纯系统配置环境-CSDN博客 一 系统环境配置&#xff1a; 1.更换源&#xff1a; sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list2.更新源&#xff1a; sudo apt upgradesudo apt updatesudo apt dist-upgrade sudo apt-get updat…...

Android Studio IDE环境配置

​需要安装哪些东西&#xff1a; Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装&#xff0c;需要注意下安装的路径Android Studio插件…...

PTA 7-2 0/1背包问题(回溯法) 作者 王东 单位 贵州师范学院

0/1背包问题。给定一载重量为W的背包及n个重量为wi、价值为vi的物体&#xff0c;1≤i≤n,要求重量和恰好为W具有最大的价值。 输入格式: 第一行输入背包载重量W及背包个数n&#xff0c;再依次输入n行&#xff0c;每行为背包重量wi和价值vi。 输出格式: 第一行输出装入背包内…...

Matlab环形柱状图

数据准备&#xff1a; 名称 数值 Aa 21 Bb 23 Cc 35 Dd 47 保存为Excel文件后&#xff1a; % Load data from Excel file filename data.xlsx; % Ensure the file is in the current folder or provide full path dataTable readtable(filena…...

【AI大模型】探索GPT模型的奥秘:引领自然语言处理的新纪元

目录 &#x1f354; GPT介绍 &#x1f354; GPT的架构 &#x1f354; GPT训练过程 3.1 无监督的预训练语言模型 3.2 有监督的下游任务fine-tunning &#x1f354; 小结 学习目标 了解什么是GPT.掌握GPT的架构.掌握GPT的预训练任务. &#x1f354; GPT介绍 GPT是OpenAI公…...

5.Python爬虫相关

爬虫 爬虫原理 爬虫&#xff0c;又称网络爬虫&#xff0c;是一种自动获取网页内容的程序。它模拟人类浏览网页的行为&#xff0c;发送HTTP请求&#xff0c;获取网页源代码&#xff0c;再通过解析、提取等技术手段&#xff0c;获取所需数据。 HTTP请求与响应过程 爬虫首先向…...

Windows系统上配置eNSP环境的详细步骤

华为eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是一款针对华为数通网络设备的网络仿真平台&#xff0c;用于辅助工程师进行网络技术学习、方案验证和故障排查等工作。以下是在Windows系统上配置eNSP环境的详细步骤&#xff1a; 1. 准备工作 下载安…...

Database.NET——一款轻量级多数据库客户端工具

文章目录 Database.NET简介下载使用使用场景总结 Database.NET简介 Database.NET 是一个功能强大且易于使用的数据库管理工具&#xff0c;适用于多种数据库系统。它为开发者和数据库管理员提供了一个统一的界面&#xff0c;可以方便地管理和操作不同类型的数据库。 支持的数据…...

新浪微博C++面试题及参考答案

多态是什么&#xff1f;请详细解释其实现原理&#xff0c;例如通过虚函数表实现。 多态是面向对象编程中的一个重要概念&#xff0c;它允许不同的对象对同一消息或函数调用做出不同的响应&#xff0c;使得程序具有更好的可扩展性和灵活性。 在 C 中&#xff0c;多态主要通过虚函…...

计算机视觉目标检测-1

文章目录 摘要Abstract1.目标检测任务描述1.1 目标检测分类算法1.2 目标定位的简单实现思路1.2.1 回归位置 2.R-CNN2.1 目标检测-Overfeat模型2.1.1 滑动窗口 2.2 目标检测-RCNN模型2.2.1 非极大抑制&#xff08;NMS&#xff09; 2.3 目标检测评价指标 3.SPPNet3.1 spatial pyr…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

零基础设计模式——行为型模式 - 责任链模式

第四部分&#xff1a;行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习&#xff01;行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想&#xff1a;使多个对象都有机会处…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...