• 【改题】Public Round1A 删数


    题目传送门

    题目

    给定一个长为 \(n\) 的正整数序列 \(a_1,⋯,a_n\)

    你可以进行若干次操作,每次操作你可以选择一个位置 \(i∈[2,n−1]\) 使得 \(a_i= \frac{a_{i−1}+a_{i+1} }{2}\),随后将 \(a_i\) 删去,之后的数按顺序向前补空位。

    求若干次操作后序列长度最小可以是多少。

    题解

    现在我已经可以想到差分了,把数组差分后,问题转化为每次合并两个相邻相同的数为它们之和,那就有一些性质:每次合并后这个数相当于变成原来的两倍,所以一个数只会和它的\(2\)的幂次倍合并,一个数被合并的次数为\(log\) 次。

    我没做出来的原因是因为忘记了一个“决策”的概念,而一味的在想如何线段树dp,线段树dp的问题在于,我只记录上一个块的大小, 但是这个块和上一个合并之后还能继续往前合并, 这个东西不好记录也不好转移,导致我的思路完全错了。

    实际上呢,最终合并出来的序列,每个块都是由一段连续的块合并出来的,我们把要合并出这个块,看作那一段块中最后一个的决策,这样就可以进行转移了,同时一个块至多合并\(log\)次, 所以只有\(log\)种不同的决策,复杂度也是正确的。

    具体来讲我们设\(f_i\)表示前 \(i\) 个数合并出的最小块数, 转移次枚举第\(i\)个块被合并了多少次即可。

    然后这里还要一个很妙的dp, 记 \(g_{i, j}\) 表示第\(i\)个块往左合并\(j\)次需要的左端点, 转移一下即可。

    学到了

  • 相关阅读:
    java IO
    免费的编程中文书籍索引-转
    js两种定义函数、继承方式及区别
    为什么这样写js:(function ($) { })(jQuery);
    Cannot open connection 解决办法
    dos下mysql登陆
    spring-AOP-1
    el表达式
    设计模式——"simple Factory"
    软件生产性控制
  • 原文地址:https://www.cnblogs.com/ltdjcoder/p/16138637.html
Copyright © 2020-2023  润新知