【发布时间】:2016-01-08 13:48:52
【问题描述】:
这是我遇到的问题
确定性有限自动机 (DFA) 是一种有限状态机,它接受/拒绝有限的符号字符串,并且只为每个输入字符串生成唯一的自动化计算(或运行)。
DFA 可以使用状态图来表示。例如,在下图所示的自动机中,存在三种状态:S0、S1 和 S2(用圆圈图形表示)。自动机将 0 和 1 的有限序列作为输入。对于每个状态,都有一个过渡箭头指向 0 和 1 的下一个状态。读取一个符号后,DFA 会按照过渡箭头确定性地从一个状态跳转到另一个状态。例如,如果自动机当前处于状态 S0 并且当前输入符号为 1,则它确定性地跳转到状态 S1。 DFA 具有计算开始的起始状态(以图形方式由从无到有的箭头表示)和一组接受状态(以图形方式由双圆圈表示),这些状态有助于定义计算何时成功。
0
00
000
11
110
1001
您在输入中得到一个 DFA 和一个整数 N。您必须知道给定 DFA 接受多少个长度为 N 的不同字符串。
注意事项
- 假设每个状态都有两个出边(一个代表 0,一个代表 1)。两个传出边不会进入相同的状态。
- 可能有多个接受状态,但只有一个开始状态。
- 开始状态也可以是接受状态。
输入格式
- 状态从 0 到 K-1 编号,其中 K 是 DFA 中的状态总数。
- 给您三个数组 A、B、C 和两个整数 D 和 N。
- 数组 A 表示从状态编号 i 到状态 A[i] 的 0 边,对于所有 0 ≤ i ≤ K-1
- 数组 B 表示从状态编号 i 到状态 B[i] 的第 1 条边,对于所有 0 ≤ i ≤ K-1
- 数组 C 包含所有接受状态的索引。
- 整数 D 表示开始状态。
- 整数 N 表示您必须计算给定 DFA 接受多少个长度为 N 的不同字符串。
约束
1 ≤ K ≤ 50
1 ≤ N ≤ 10^4
例子:
对于图中显示的 DFA,输入为
A = [0, 2, 1]
B = [1, 0, 2]
C = [0]
D = 0
输入 1
N = 2
Strings '00' and '11' are only strings on length 2 which are accepted. So, answer is 2.
输入 2
N = 1
String '0' is the only string. Answer is 1.
我的解决方案
我在 Mind 中有一个蛮力递归解决方案,其工作原理如下:
- 从开始状态开始。让它成为
curr - 检查
N==0和curr是否为接受状态,然后将1增加到总状态并返回; - 现在将
0 and 1作为输入,让curr状态变为curr0和curr1。使用curr状态为curr0和curr1以及N-1调用递归函数两次;
我的解决方案有问题
但问题是这个解决方案将检查所有可能的长度为N 的字符串,其中包含{0,1}。所以它的时间复杂度是2^N,因为1 <= N <= 10^4这是指数级的,不可行。
问题
有人可以建议这个问题的有效解决方案吗?可能这个问题是 NP-Complete 的,这是唯一的解决方案。任何帮助将不胜感激。
【问题讨论】:
-
出边能否“跳过”状态(例如,S0 直接到 S2)?
-
是的,它可以从任何状态转到任何其他状态
标签: algorithm data-structures np-complete