跳跃游戏问题与自动机

跳跃游戏问题与自动机

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 PQ 是否存在。

连通向量是一个元素不重复的集合,包含了从设从P到Q的路径D有i条,则 P ⟶ ∗ Q = ⋃ 0 i D i _P \stackrel{*}{\longrightarrow} _Q = \stackrel{i}{\displaystyle\bigcup_{0}} D_i PQ=0iDi

如有图

A
B
C
D

则有 A → ∗ D = A B , B C , C D A \stackrel{*}{\rightarrow} D = {AB,BC,CD} AD=AB,BC,CD

设有中间节点U,M, P → ∗ U , P → ∗ Q ⊂ P → ∗ Q _P \stackrel{*}{\rightarrow} _U ,_P \stackrel{*}{\rightarrow} Q \subset _P \stackrel{*}{\rightarrow} _Q PU,PQPQ,M不超过Q,则易知在图G中, U , M ∈ ∁ V P , Q U,M \in \complement _V {P,Q} U,MVP,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} PU=PUPU=PM(P,U邻接)P,U不邻接)
易知 P → ∗ U _P \stackrel{*}{\rightarrow} _U PU P → ∗ M _P \stackrel{*}{\rightarrow} _M PM的关系有两种情况,即后者者为前者的真子集,或子集,也即 M → ∗ U _M \stackrel{*}{\rightarrow} _U MU是否为空集。

设有非确定下推自动机M({q1,q2,q3,q4,q5},V(G),{0},q1,d,{q4}),栈长度为 M → ∗ U _M \stackrel{*}{\rightarrow} _U MU的长度 ∣ M → ∗ U ∣ |_M \stackrel{*}{\rightarrow} _U| MU,M为指针位置。

x,L0
e,0
e,L0
x,L0
e,0/00
x,0/00
e,0
q1
q2
q3
q4
q5

(诶csdn对mermaid的支持一言难尽)

当M抵达状态q4时,正好使 M → ∗ U _M \stackrel{*}{\to} _U MU 为空集,如果仍不抵达字符串末尾,则进入状态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

函数给出的语言是,,字母表 ∑ = Z \sum = Z =Z

算不出来,下推自动机算加减法太复杂了,感觉蛮南蚌的,它的状态和变量大小成规模,硬算我会似的。

一个选择结构

cs
body
ce

然后是循环结构

e,x,x
x,x,x
e,x,x
cs
body
ce

你可能感兴趣的:(算法,数据结构,leetcode)