题意
给定长度为(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))