在读完题目后,经典没有思路,后来一想大概率用动态规划,因此选择了动态规划尝试。
尝试很久并没有很好解决题目,看了相关资料才完成的这一题目。
状态定义
动态规划是一个带有格外存储空间的循环,因此必然会考虑i和i-1。
对于一个长为N的数字序列,按题目要求进行排序的时候,假设在选择第i个位置的上的数字时,第i位置数字的选取是跟0到i-1的位置上数字的选取有关的(每一个固定的0到i-1的位置上数字的选取方式,在i-N序列部分可不同)。在进行第i个位置上数字选定的时候,知道1-N各个数字的选择状态是十分必要的。
因此状态定义为f[i][state],i为考虑第i个位置的数,state为1-N这些所有数字的使用状态情况。
转移方程
考虑f[i+1][state],假设i+1位的数为k,需要满足题目的条件:i+1能被k整除,k能被i+1整除;第i+1位为1。
在选择i+1位的数为k时,意味着i+1的state的第k位必须为1,而i的state的第k位必须为0。(因为同一个数只能在一个数位上出现)
转移方程如下:
在满足题目的两个要求之下,
f[i+1][state]= f[i][state&(~(1<<(k-1)))] (k从1取到N,所有的数叠加起来)
初始条件
f[0][0]=1
最终结果
f[N][state-1]