by Amamiya Fuko
春叶连天翠,团簇挤枝头
FUKO⭐️参上deze,最近为了研究BFS跑去研究了自动机,结果发现自动机好像并不是这么适合解决图论问题,这里就先写关于自动机的内容。续篇 跳跃游戏与自动机(续)
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。
示例 1:
输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。
示例 2:
输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。
设有图G,nums为图G的顶点集 V ( G ) V(G) V(G),numsSize为顶点集长度 v = ∣ V ( G ) ∣ v = |V(G)| v=∣V(G)∣,P为nums[0],Q为nums[v-1],求连通向量 P ⟶ ∗ Q P \stackrel{*}{\longrightarrow} Q P⟶∗Q 是否存在。
连通向量是一个元素不重复的集合,包含了从设从P到Q的路径D有i条,则 P ⟶ ∗ Q = ⋃ 0 i D i _P \stackrel{*}{\longrightarrow} _Q = \stackrel{i}{\displaystyle\bigcup_{0}} D_i P⟶∗Q=0⋃iDi
如有图
则有 A → ∗ D = A B , B C , C D A \stackrel{*}{\rightarrow} D = {AB,BC,CD} A→∗D=AB,BC,CD
设有中间节点U,M, P → ∗ U , P → ∗ Q ⊂ P → ∗ Q _P \stackrel{*}{\rightarrow} _U ,_P \stackrel{*}{\rightarrow} Q \subset _P \stackrel{*}{\rightarrow} _Q P→∗U,P→∗Q⊂P→∗Q,M不超过Q,则易知在图G中, U , M ∈ ∁ V P , Q U,M \in \complement _V {P,Q} U,M∈∁VP,Q,则有
P → ∗ U = P U ( P , U 邻接 ) P → ∗ U = P → ∗ M ( P , U 不邻接 ) \begin{array}{ll} _P \stackrel{*}{\rightarrow} _U = PU & (P,U邻接) \\ _P \stackrel{*}{\rightarrow} _U = _P \stackrel{*}{\rightarrow} _M & (P,U不邻接) \end{array} P→∗U=PUP→∗U=P→∗M(P,U邻接)(P,U不邻接)
易知 P → ∗ U _P \stackrel{*}{\rightarrow} _U P→∗U与 P → ∗ M _P \stackrel{*}{\rightarrow} _M P→∗M的关系有两种情况,即后者者为前者的真子集,或子集,也即 M → ∗ U _M \stackrel{*}{\rightarrow} _U M→∗U是否为空集。
设有非确定下推自动机M({q1,q2,q3,q4,q5},V(G),{0},q1,d,{q4}),栈长度为 M → ∗ U _M \stackrel{*}{\rightarrow} _U M→∗U的长度 ∣ M → ∗ U ∣ |_M \stackrel{*}{\rightarrow} _U| ∣M→∗U∣,M为指针位置。
(诶csdn对mermaid的支持一言难尽)
当M抵达状态q4时,正好使 M → ∗ U _M \stackrel{*}{\to} _U M→∗U 为空集,如果仍不抵达字符串末尾,则进入状态q5,自动机不接受该字符串。
下面我们尝试构建一个确定的下推自动机,这里先给出代码(因为我写到这的时候还没想出来)。
bool canJump(int* nums, int numsSize) {
if(numsSize==1)return 1;
int u = nums[0];
for(int i = 0; iu)return 0;
if(u
函数给出的语言是,
算不出来,下推自动机算加减法太复杂了,感觉蛮南蚌的,它的状态和变量大小成规模,硬算我会似的。
一个选择结构
然后是循环结构