CF1461F

题意

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

\(n\in[1,10^5]\)

做法

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

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

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

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

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

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

\(\{a_i\}\),满足\(\forall i\in[1,n],a_i\ge 1\)

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

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

结论1:若\(\prod\limits_{i=1}^n a_i\ge 2n\),则全部用\('*'\)连接起来最优

证明:
假设乘积\(\ge 2n\)
若中间出现了\('+'\),则最优解一定是这种形式
\((d_{11} * d_{12} * d_{13} * … ) + 1 + 1 + … 1 + (d_{21} * d_{22} * …) + 1 + 1 + … + (d_{k1} * d_{k2} * …)\)
其中\(k\ge 2\)
\(a_i = d_{i1} * d_{i2} * …\),令\(P=\prod\limits_{i=1}^k a_i\)\(k\ge 2,P\ge 2n\)
我们可以证明\(\sum_{i=1}^k a_i \leq 2 + P / 2\),那么\(\sum_{i=1}^k a_i \leq 2 + P / 2\leq 2 + P / 2 + n - k \leq P / 2 + n\)
由于\(P\ge 2n\),则\(P/2+n\le 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_i\ge 2\),故\(a_1 + \frac{P}{a_1}\leq 2 + P / 2\)
对于\(k>2\),由于\(a_i\ge 2\),故\(\sum_{i=1}^k a_i \leq (\sum_{i=1}^{k-2}a_i) + a_{k-1}a_{k}\),这是\(k-1\)的形式
得证

根据结论1,我们仅需考虑\(\prod\limits_{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_i\ge 2\)的个数只有\(O(logn)\)个,这个dp的时间复杂度为\(O(nlogn)\)

posted @ 2020-12-13 18:52  Grice  阅读(90)  评论(0编辑  收藏  举报