零、状态机
两篇比较好的博客:
什么是状态机(Finite-state machine)?by JMW1407
什么是状态机?by pingxiaozhao
一、大盗阿福
按照传统的线性DP分析,设 f [ i ] f[i] f[i] 表示抢劫前 i i i 家店铺可以得到的最多现金,容易得出 f [ i ] = m a x ( f [ i − 2 ] + w , f [ i − 1 ] ) f[i]=max(f[i-2]+w,f[i-1]) f[i]=max(f[i−2]+w,f[i−1]),但这个递推式需要用到前两层的状态,能否像之前的所有DP问题一样,只用前一层的状态呢?
一维状态表示显然无法胜任,因为题目有“不能抢劫相邻的商店”的限制,而我们不知道前一个商店是否被抢劫过。
不难想到,我们可以额外加一维状态, f [ i , j ] f[i,j] f[i,j] 表示集合:所有抢劫前 i i i 家店铺,且第 i i i 家店铺状态为 j j j ( j = 0 j=0 j=0 代表未被抢劫, j = 1 j=1 j=1 代表已被抢劫) 的选法的集合。
在店铺已被抢劫与未被抢劫的状态之间存在以下的状态机模型:
从而有 f [ i , 0 ] = m a x ( f [ i − 1 , 0 ] , f [ i − 1 , 1 ] ) , f [ i , 1 ] = f [ i − 1 , 0 ] + w [ i ] f[i,0]=max(f[i-1,0],f[i-1,1]),f[i,1]=f[i-1,0]+w[i] f[i,0]=max(f[i−1,0],f[i−1,1]),f[i,1]=f[i−1,0]+w[i]
初始化 (入口):根据状态的定义,可知 f [ 0 , 0 ] = 0 , f [ 0 , 1 ] = +