ABC327E - Maximize Rating

题目大意:给定序列 P,求出其一子序列 Q ( Q 1 , Q 2 , . . . Q k ) (Q_1,Q_2,...Q_k) (Q1,Q2,...Qk),使得表达式 ∑ i = 1 k 0. 9 k − i Q i ∑ i = 1 k 0. 9 k − i − 1200 k \large\frac{\sum_{i=1}^{k}0.9^{k-i}Q_i}{\sum_{i=1}^{k}0.9^{k-i}}-\frac{1200}{\sqrt k} i=1k0.9kii=1k0.9kiQik 1200 的值最大。

我的思维问题重点在于不会处理 1200 / k 1200/\sqrt k 1200/k 。考虑分开讨论 k 的情况:对于每一个 k = 1 , 2 , … , n k=1,2,\dots,n k=1,2,,n,观察到式子中只有 ∑ i = 1 k 0. 9 k − i Q i \sum_{i=1}^{k}0.9^{k-i}Q_i i=1k0.9kiQi 的值变化,而该值的max可以通过dp实现,具体可以使用dp实现的原因是:假设我们要求前 i 个数中选长度为 k 的子序列的最大值 f [ i ] [ k ] f[i][k] f[i][k],那么所需的 f [ i − 1 ] [ k − 1 ] f[i-1][k-1] f[i1][k1] 都要乘上0.9再贡献,所以是平等的,对结果不造成影响。如果比较难理解,可以采用倒序dp,这时就不用乘上0.9。

dp的式子很好写, j = 1 j=1 j=1 f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , p [ i ] ) f[i][j]=max(f[i-1][j],p[i]) f[i][j]=max(f[i1][j],p[i])
j = i j=i j=i f [ i ] [ j ] = f [ i − 1 ] [ j − 1 ] × 0.9 + p [ i ] f[i][j]=f[i-1][j-1]\times0.9+p[i] f[i][j]=f[i1][j1]×0.9+p[i]
1 < j < i 11<j<i f [ i ] [ j ] = m a x ( f [ i − 1 ] [ j ] , f [ i − 1 ] [ j − 1 ] × 0.9 + p [ i ] ) f[i][j]=max(f[i-1][j],f[i-1][j-1]\times0.9+p[i]) f[i][j]=max(f[i1][j],f[i1][j1]×0.9+p[i]);

最后求对于每个 k 的最大值即可,总时间复杂度是 O ( n 2 ) O(n^2) O(n2)

c o d e code code

你可能感兴趣的:(题解,考试总结,dp,c++,算法)