经过将近一周的状压DP,一开始做的比较慢还在摸索阶段,对几道题的理解感觉还不是很周到,比如专题里的W钥匙计数之一,这道题其实是用递推的思路去找规律,设lock[n]计做n个凹槽时,符合要求的钥匙总数。将yi[n]计做n个凹槽时,第n个凹槽为1时符合要求的钥匙总数。将er[n]计做n个凹槽时,第n个凹槽为2时符合要求的钥匙总数。且1=4,2=3;对与第n个凹槽,有两种情况。
1.前n-1个凹槽以构成钥匙,那么对于第n个凹槽而言,无论第n个凹槽为1/2/3/4,都有lock[n-1]种情况。
2.前n-1个凹槽未构成钥匙,加了第n个凹槽后才符合钥匙规则,那么分两种情况
A.当第n个凹槽为 2/3时,前面n-1个凹槽必须为1/4构造而成的,出去两种全为1/4的情况,即2^(n-1)-2种情况
B.当第n个凹槽为1/4时,前面n-1个凹槽的构成有多种情况,将这多种情况分析清楚:
假设第n个凹槽为1:
则前面n-1个凹槽的构成情况有如下几种
{
A1.前n-1个凹槽由4种类型组成,但未有相邻两个凹槽高度差为3的。
A2.前n-1个凹槽由4种类型组成,有相邻两个凹槽高度差为3的。
B1.前n-1个凹槽由3种类型组成,但未有相邻两个凹槽高度差为3的。
B2.前n-1个凹槽由3种类型组成,有相邻两个凹槽高度差为3的。
C1.前n-1个凹槽由2种类型组成,但未有相邻两个凹槽高度差为3的。
C2.前n-1个凹槽由2种类型组成,有相邻两个凹槽高度差为3的。
D. 前n-1个凹槽由1种类型组成。
}
由已知条件“前n-1个凹槽未构成钥匙,加了第n个凹槽后才符合钥匙规则”,可以将A2,B2,C2,D的全部情况排除,推得结论n-1个凹槽上必须为4,才符合已知条件。即:A1+B1+C1=all-(A2+B2+C2+D)=1*4^(n-2)-(one[n-1]+1*2^(n-2)-1+1)
综合以上两种情况:
yi[n]=4^(n-2)-(yi[n-1]+2^(n-2))+lock[n-1]
er[n]=2^(n-1)-2+lock[n-1]
lock[n]=2*(yi[n]+er[n])
还有H题,这道题的意思是编写一个程序使产生的功率和最大,这个题目对于每个粒子有存在和消失两种状态,自然总的状态数有2^n种。 对于某种状态,如果用普通的表示,自然有dp[0][1][0]……[1](其中1表示存在,0表示消失),因为每个粒子只有0和1两种值,此处采用二进制进行状态压缩。 接下来考虑对于某个状态10001011,如果第一1要变成0,自然是考虑这个粒子和现存的粒子进行碰撞,然后找能达到的最大值。我们记这个值为GetMax(state, now)(其中state是当前二进制状态,now是由1转为0的那一位)。于是考虑状态转移方程,对于状态10001,必然由状态11001或10101或10011转换而来,自然对于state,可以由某个0位变成1的状态forestate转换而来。所以:dp[state] = max{dp[forestate] + GetMax(forestate, now)}这里就要采用记忆化搜索进行求解。初始状态M = (1<<n)^0。