hdu 5691 Sitting in Line(状压dp)

Posted jpphy0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 5691 Sitting in Line(状压dp)相关的知识,希望对你有一定的参考价值。

问题

hdu 5691 Sitting in Line - https://acm.hdu.edu.cn/showproblem.php?pid=5691

分析

实质

  • 求解最优排列

贪心策略

  • 例如:3,-1,-5,4(不预设任何位置)
  • 若前面两个数是4、-5,则有两种排列
    • 4,-5,结果是:-20
    • -5,4,结果是:-20
    • 这两个排列哪个更优呢?答案:无法比较。理由如下:
  • 若扩展一个3,则有
    • 4,-5,3,结果是:-35
    • -5,4,3,结果是:-8
    • 显然,后者对应了较优解
  • 若扩展一个-1,则有
    • 4,-5,-1,结果是:-15
    • -5,4,-1,结果是:-24
    • 显然,前者对应了较优解
  • 结论:当集合 { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1a2ak} 中的元素构成一个排列时,只有尾元素相同时才能比较优劣,即可贪心,因此有k个结果
    • { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1a2ak} a 1 a_1 a1 结尾
    • { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1a2ak} a 2 a_2 a2 结尾
    • ……
    • { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1a2ak} a k a_k ak 结尾

状态定义

  • 上述k个结果就是k个状态
  • 如何表示状态?需要 个量
    • 已经被排列的数的集合
    • 排列中的最后一个元素
  • 如何表示集合?
    • 集合 ⇒ 映 射 \\quad\\overset{映射}{\\Rightarrow}\\quad 二进制
    • 设集合 { a 2 , a 3 , a 5 , a 7 , a 12 , a 16 } \\{a_2,a_3,a_5,a_7,a_{12},a_{16}\\} {a2a3a5a7a12a16}
    • 16位二进制: 1000    1000    0101    0110 1000\\;1000\\;0101\\;0110 1000100001010110,将元素的下标对应的二进制 置1
  • d p [ s ] [ i ] dp[s][i] dp[s][i] s s s 为元素下标的映射, i i i 为尾元素的下标
  • 状态转移
    • d p [ s ∣ ( 1 < < ( j − 1 ) ) ] [ j ] = m a x ( d p [ s ∣ ( 1 < < ( j − 1 ) ) ] [ j ] , d p [ s ] [ i ] + a i × a j ) dp[s | (1<< (j-1))][j]=max(dp[s | (1<< (j-1))][j],dp[s][i]+a_i \\times a_j) dp[s(1<<(j1))][j]=max(dp[s(1<<(j1))][j]dp[s][i]+ai×aj)

真实态、虚假态

  • 设共有4个元素 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1a2a3a4,其中 a 2 a_2 a2 预设在 0 位置
  • 那么,将 a 2 a_2 a2 排在 0 位置的状态 [ 0010 ] [ 2 ] [0010][2] [0010][2] 是合理的、真实的
a2
0010,2
  • 相反,将 a 1 a_1 a1 排在 0 位置的状态 [ 0001 ] [ 1 ] [0001][1] [0001][1] 是不合理、虚假的;同理,将 a 3 、 a 4 a_3、a_4 a3a4 排在 0 位置都是虚假态

以上是关于hdu 5691 Sitting in Line(状压dp)的主要内容,如果未能解决你的问题,请参考以下文章