pgi*_*itu 5 algorithm np-complete data-structures
这是我遇到的问题
确定性有限自动机(DFA)是一种有限状态机,它接受/拒绝符号的有限字符串,并且仅对每个输入字符串产生唯一的自动化计算(或运行)。
DFA可以使用状态图表示。例如,在下面显示的自动机中,存在三种状态:S0,S1和S2(以圆圈图形表示)。自动机将0和1的有限序列作为输入。对于每个状态,都有一个过渡箭头,分别指向0和1的下一个状态。读取符号后,DFA会跟随过渡箭头从一个状态确定地跳到另一状态。例如,如果自动机当前处于状态S0,并且当前输入符号为1,则它确定性地跳到状态S1。DFA具有计算开始的起始状态(以图形表示从无处进入的箭头)和一组接受状态(以双圆圈图形表示),它们有助于定义计算何时成功。
0
00
000
11
110
1001
Run Code Online (Sandbox Code Playgroud)
您会在输入中获得一个DFA,并输入一个整数N。您必须知道给定DFA接受多少个长度为N的不同字符串。
笔记
输入格式
约束条件
1 ? K ? 50
1 ? N ? 10^4
Run Code Online (Sandbox Code Playgroud)
范例:
对于图像中显示的DFA,输入为
A = [0, 2, 1]
B = [1, 0, 2]
C = [0]
D = 0
Run Code Online (Sandbox Code Playgroud)
N = 2
Strings '00' and '11' are only strings on length 2 which are accepted. So, answer is 2.
Run Code Online (Sandbox Code Playgroud)
N = 1
String '0' is the only string. Answer is 1.
Run Code Online (Sandbox Code Playgroud)
我在Mind中有一个蛮力递归解决方案,其工作方式如下:
currN==0和curr是接受状态,则增加1总的状态和回报;0 and 1作为输入,让curr状态进入curr0和curr1。用curr状态as curr0和curr1并且用with 两次调用递归函数N-1;但问题是,这种解决方案将检查长度的所有可能的字符串N包含{0,1}。因此,它的时间复杂度是2^N并且因为1 <= N <= 10^4这是指数级的并且不可行。
有没有人可以建议的有效解决方案?可能是NP-Complete这个问题,这是唯一的解决方案。任何帮助,将不胜感激。
解决方案中的想法很好。问题在于,它可以对完全相同的状态和N进行多次递归调用。如果0和1都将开始状态转换为相同的新状态,则可以看到一个简单的示例,它将在相同的状态上进行相同的调用。新状态两次。
此属性是可以使用动态编程和/或记忆来改进的算法的标志。取决于您与谁交谈,这两种技术既可以是同一事物,也可以是近亲。无论哪种方式,它们都可以确保任何给定呼叫的工作仅完成一次,即使稍后出现相同的呼叫也是如此。(相同的呼叫只能产生与原始呼叫相同的答案。)
为此,我们需要跟踪进行了哪些调用,即已计算出(状态,长度)的哪些组合。我们可以将这些答案保存在表格中。
首先初始化表中所有的Length = 0点。如果状态为接受状态,则用1填充该点;否则,用1填充该点。如果状态不是接受状态,则用0填充点。现在从1到N循环K。对于每个K,循环遍历所有状态S。用Table [S0,K-1]填充Table [S,K] ] + Table [S1,K-1],其中S0是状态S在输入0时转换为状态,而S1在输入1时转换为状态。
最后,从Table [StartState,N]中读出答案。
| 归档时间: |
|
| 查看次数: |
2630 次 |
| 最近记录: |