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\\}
{a1,a2,⋯,ak} 中的元素构成一个排列时,只有尾元素相同时才能比较优劣,即可贪心,因此有k个结果
- { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1,a2,⋯,ak}及 a 1 a_1 a1 结尾
- { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1,a2,⋯,ak}及 a 2 a_2 a2 结尾
- ……
- { a 1 , a 2 , ⋯ , a k } \\{a_1,a_2,\\cdots,a_k\\} {a1,a2,⋯,ak}及 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}\\} {a2,a3,a5,a7,a12,a16}
- 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<<(j−1))][j]=max(dp[s∣(1<<(j−1))][j],dp[s][i]+ai×aj)
真实态、虚假态
- 设共有4个元素 a 1 , a 2 , a 3 , a 4 a_1,a_2,a_3,a_4 a1,a2,a3,a4,其中 a 2 a_2 a2 预设在 0 位置
- 那么,将 a 2 a_2 a2 排在 0 位置的状态 [ 0010 ] [ 2 ] [0010][2] [0010][2] 是合理的、真实的
- 相反,将 a 1 a_1 a1 排在 0 位置的状态 [ 0001 ] [ 1 ] [0001][1] [0001][1] 是不合理、虚假的;同理,将 a 3 、 a 4 a_3、a_4 a3、a4 排在 0 位置都是虚假态