博文

目前显示的是标签为“dp”的博文

【洛谷】题解 P1633 【二进制】

dalao 都用 DP,我发一发贪心的题解。 DP 题硬生生被做成了思维题 首先,不考虑长度限制,只考虑两个数字的 1 的个数。设 A 中 1 的个数为  an a n  ,B 中为  bn b n  ,C 中为  cn c n  。 如果  an+bn<cn a n + b n < c n  的话,显然无解,因为 1 不可能被凭空创生而来。如果  an+bn=cn a n + b n = c n  的话,只需要不产生进位,即让两个加数的二进制表示全部错开就好。然后考虑  an+bn>cn a n + b n > c n  的情况。 在这种情况下,我们需要通过进位消掉  an+bn-cn a n + b n − c n  个 1,然后保证答案最小。 容易发现,可以简单地使用连续进位来消掉任意个数的 1: 11111 + 1 ------ 100000 消掉的 1 的个数即为第一个加数的长度。 严格来说,消掉的 1 的个数的范围为  [0,an+bn-1] [ 0 , a n + b n − 1 ]  。因为,我们可以这样子: 11111 1 + 111111 -------------- 100000000000 (空格为 0) 可行性可以保证。然后就是考虑最优性。 很显然,对于这样一组连续进位,两个加数在连续进位之前的位必须都是 0。也就是说,算式里面最多只能有一组连续进位。如果有两组连续进位,可以将这两组合并,然后偷掉一个位(全 0 位显然可以直接抠掉),这样两个加数都会变小,和也会变小。 唯一的进位处就在那个连续进位的地方。 同理,这个连续进位必须在最高位。如果不是的话,可以交换顺序使它在最高位,然后偷掉一个位。 基本框架就确定了,由于消掉的 0 的个数确定,连续进位的长度也确定了,然后只需要在这个基础上贪心地将 1 用完就好了。 在这个连续进位式骨架上,我们可以做的事情包括将一个连续进位中的改成 1,以及在后面跟单独一个 1。容易证明,最优的解就是尽量用 1 填那个进位中的空,如果还有多余的 1...

动态规划初步

Update 2019.8.23 又回来刷题了。。。。 最近发现小绿本(《算法竞赛入门经典——习题与解答》)上的题值得一做,题解都写得很清真,不会像某谷上的题解,有一些奇技淫巧,不看  C o d e C o d e  的情况下一般都可以打出来,提高自己的代码实现能力。 然后我就先从动态规划开始吧  q w q q w q  ~~ 小紫书 例题:9-1 题目链接:[ 洛谷 ] [ UVA ] 分析: 我觉得刘汝佳分析的思路写的很好,先抄下来: 时间是单向流逝的,是一个天然的 ”序“ 。影响到决策的只有当前时间和所处车站,所以可以用  d [ i ] [ j ] d [ i ] [ j ]  表示时刻  i i  ,你在车站  j j  ,最少还需要多少等待时间。边界条件是  d [ T ] [ n ] = 0 d [ T ] [ n ] = 0  ,其他  d [ T ] [ j ] = ∞ ( j ≠ n ) d [ T ] [ j ] = ∞ ( j ≠ n )  。有 3 种决策: 等 1 分钟 做左边的车 做右边的车 然后反着推就可以啦~ 思路好清晰鸭 qwq,我写题解完全不能达到的水平…… C o d e C o d e : 第一次打的时候用的是  E m a c s E m a c s  ,然后我的配置文件有一点问题,然后编译以后代码就被吃了。。。。 劳资又 tm 打了一遍。。。。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 7...