zoukankan      html  css  js  c++  java
  • 「POI2007」四进制天平 Quaternary Balance 题解

    「POI2007」四进制天平 Quaternary Balance 题解

    (n) 可以到 (10^{1000}) ,所以考虑数位 (dp)

    当然这只是个直觉,具体怎么做呢?

    砝码的质量都是 (4) 的幂,称出质量为 (m) 的物体,可以看成是一个 (4) 进制大整数的逐位确定,放左盘可理解为加法(该位为正),放右盘可理解为减法(该位为负),可以看出左右盘不可能都放。最后用的总砝码数等于各位数码的绝对值之和。

    由于有负数,出现了前面放多,后面借位的可能,例子:

    3  2  3  1
    4  -1 0 -3
    

    (S_{l,r})(n(base 4)) (n 为原数)中 ([l...r]) 一段拼接出的数。如果 (pos) 这一位多放了 (1) ,其实多的是 (4^{len-pos} - S_{pos+1,len}),那么后面为了借回来,就要用 (4^{len-pos}),为了平衡回来,后面就得变成 (4^{len-pos} - S_{pos+1,len}) 的四进制表示,再每位取相反数了。这等价于把 (pos + 1 ... len-1) 位减去 (3) ,最后一位减去 (4)

    那么借位肯定是连续的一段。提前结束一段也有可能:

    3  2  3  1
    4  -2 3  1
    

    结束一段后就恢复正常了。

    我们再看看多段的情况:

    1 *3  1  0 *2  2 *3  2
    1  4  -2 -4 2  2  4  -2
    

    不难发现,每段都是独立的,

    那么可以设计出求最小砝码数的 (dp)(dp1_{i,j}) 表示考虑到第 (i) 位,这位是否在“一段”中。算好数码转移就好了,(O(len)) 的。

    这题求的是方案数。要求还原方案的 (dp) 题写过吧?其实求方案数也一样,设一个 (dp2_{i,j}) ,算 (dp2) 时,只要 (dp1) 从这种方式转移过来是最优的,我们就可以累加。也是 (O(len)) 的。

    所以这题数据似乎还可以加强...

  • 相关阅读:
    我国大部分地区今晚将上演红色月全食美景[2007828]
    n阶汉诺塔问题(Hanoi)
    NBear中使用WhereClip表示in查询的问题
    web性能测试分析理论篇
    Net类库一览 转
    使用ASP.Net Forms模式实现WebService身份验证
    2005数据源的相关数据绑定
    单位分级,涵闸和人员绑定到树
    ajax,js文件中中文显示成乱码的问题
    WinFom应用程序数据操作技巧
  • 原文地址:https://www.cnblogs.com/yz-beacon-cwk/p/14993054.html
Copyright © 2011-2022 走看看