zoukankan      html  css  js  c++  java
  • CF1461F

    题意

    给定长度为(n)的整数序列({a_i}(a_iin[0,9])),给定运算集合,保证其为({+,-,*})的非空子集
    求一种方案使得在任意(i,i+1(i<n))间插入给定运算集合中的元素,使得运算结果最大

    (nin[1,10^5])

    做法

    以下考虑运算集合大小不为(1)的情况

    对于运算集合为({+,-}),显然最优解只会用到('+')

    对于运算集合为({-,*}),在第一个(0)前放('-'),其他位置放('*'),正确性显然

    对于运算集合为({+,-,*}),显然不会出现('-')

    以下讨论运算集合为({+,*})

    对于出现的(0),我们会在其前后放('+'),故转化:

    ({a_i}),满足(forall iin[1,n],a_ige 1)

    显然对于首或尾的(1),我们会在其前后放('+'),故转化为:

    ({a_i}),满足(a_1,a_n>1)

    结论1:若(prodlimits_{i=1}^n a_ige 2n),则全部用('*')连接起来最优

    证明:
    假设乘积(ge 2n)
    若中间出现了('+'),则最优解一定是这种形式
    ((d_{11} * d_{12} * d_{13} * … ) + 1 + 1 + … 1 + (d_{21} * d_{22} * …) + 1 + 1 + … + (d_{k1} * d_{k2} * …))
    其中(kge 2)
    (a_i = d_{i1} * d_{i2} * …),令(P=prodlimits_{i=1}^k a_i)(kge 2,Pge 2n)
    我们可以证明(sum_{i=1}^k a_i leq 2 + P / 2),那么(sum_{i=1}^k a_i leq 2 + P / 2leq 2 + P / 2 + n - k leq P / 2 + n)
    由于(Pge 2n),则(P/2+nle P),故全部用('*')最优
    下面证明(sum_{i=1}^k a_i leq 2 + P / 2)
    (k)施归纳:
    (k=2)时,(a_1 + a_2 = a_1 + frac{P}{a_1}),这是对勾函数的形式,由于(a_ige 2),故(a_1 + frac{P}{a_1}leq 2 + P / 2)
    对于(k>2),由于(a_ige 2),故(sum_{i=1}^k a_i leq (sum_{i=1}^{k-2}a_i) + a_{k-1}a_{k}),这是(k-1)的形式
    得证

    根据结论1,我们仅需考虑(prodlimits_{i=1}^n a_i< 2n)的情况
    (f_i)为前(i)个位置的最大答案(钦定(i)(i+1)间用('+')连接)
    (a_{i+1}=1),我们可以只将(f_i)转移到(f_{i+1})那里
    (a_{i+1}>1),枚举(f_i)转移到(f_j(j>i))
    由于其中(a_ige 2)的个数只有(O(logn))个,这个dp的时间复杂度为(O(nlogn))

  • 相关阅读:
    CSS 选择器
    CSS 用法和特性
    Objective-C 事件响应链
    苹果签名机制
    欧几里得算法
    扩展欧几里得算法
    RSA算法
    动态库加载和代码签名
    __attribute__
    信息熵
  • 原文地址:https://www.cnblogs.com/Grice/p/14129545.html
Copyright © 2011-2022 走看看