leetcode 526.优美的排列(状态压缩动态规划+带图详解)

在读完题目后,经典没有思路,后来一想大概率用动态规划,因此选择了动态规划尝试。

尝试很久并没有很好解决题目,看了相关资料才完成的这一题目。

状态定义

        动态规划是一个带有格外存储空间的循环,因此必然会考虑ii-1

        对于一个长为N的数字序列,按题目要求进行排序的时候,假设在选择第i个位置的上的数字时,第i位置数字的选取是跟0i-1的位置上数字的选取有关的(每一个固定的0i-1的位置上数字的选取方式,在i-N序列部分可不同)。在进行第i个位置上数字选定的时候,知道1-N各个数字的选择状态是十分必要的。

              

        因此状态定义为f[i][state]i为考虑第i个位置的数,state1-N这些所有数字的使用状态情况。

转移方程

         考虑f[i+1][state],假设i+1位的数为k,需要满足题目的条件:i+1能被k整除,k能被i+1整除;第i+1位为1。

        在选择i+1位的数为k时,意味着i+1state的第k位必须为1,而istate的第k位必须为0。(因为同一个数只能在一个数位上出现)

              转移方程如下:

              在满足题目的两个要求之下,

                        f[i+1][state]= f[i][state&(~(1<<(k-1)))]      (k从1取到N,所有的数叠加起来)

初始条件

        f[0][0]=1

最终结果

         f[N][state-1]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值