-
首先了解何为状态机?
状态机:它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前” 节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态, 状态机停止。(百度搜的,反正我是看不懂。)
换句人话来说就是不同状态可以通过某些方式进行转换。例如在游戏中,操作人物从走的状态变成跑的状态这种就可以称为状态机。(当然,这些都不重要,就是个名字而已。) -
状态机模型:通过类似上述“状态变换”的角度分析动态规划问题,这类问题就是状态机模型。例如下面这道题就是状态机模型的简单应用:
题目:大意:街道上有N家店铺,每家店铺有一个价值,现有一劫匪进行抢劫,但是不能抢劫连续两个相邻的店铺,每个店铺都有一个价值,求能抢劫到的最大价值。
思路:这是状态机模型最简单的应用,当然这题状态比较少,用背包也能做,注意对比二者的思维方式的不同。
背包(从物品角度出发):显然不考虑抢劫店铺的限制,就是简单的01背包问题。考虑限制也就是加上个限制罢了,思考角度还是一样的。f[i] 表示从前 i 个中选的方案,依据最后一步划分即 第i个 选或不选。不选 f[i]=f[i-1]。因为第 i 个是选的,那么第 i-1 个不能选,即f[i]=f[i-2]+w[i].
状态机(从状态角度出发):对于每个店铺只有抢和不抢两种状态,我们根据状态的转移进行求解。
f[i,j] 表示从前 i 家店铺中选,且第 i 家抢或不抢的方案。(j为0代表不抢,j为1代表抢)。
显然根据状态定义 对于f[i,0]=max(f[i-1,1],f[i-1,0]). f[i,1]=f[i-1,0]+w[i]。对于f[0,j]就相当于我们进入状态机的虚拟入口,根据定义 f[0,0]=0。 f[0,1]不存在,所以赋值为负无穷。
并且对于状态机模型要找好入口和出口,即开始的状态和结束的状态。
通过题目我们发现,状态机模型就是通过状态的角度,进行求解动态规划问题,尤其是在多个状态的时候,非常的清晰。