[ABC267D] Index × A(Not Continuous ver.) Solution

更好的阅读体验戳此进入

题面

求序列 An 的长度为 m 的最大权值子序列 Bm,定义序列 Bm 的权值为 i=1mi×Bi。输出最大权值。

Solution

提供一种不同的思路

一种显而易见的思路就是考虑 i 是否选,则 DP 是 2D0D 的,这里提供一种 2D1D2D0D 的做法。

我们考虑一个类似 LIS 的做法,考虑令 dp(i,j) 表示长度为 i 的以 j 结尾的子序列的最大权值,转移显然为:

dp(i,j)=maxk=1j1dp(i1,k)+i×Aj

即考虑从之前的某一个最优子序列拼过来。

这个东西十分显然可以简单写一个前缀和优化,最终复杂度 O(n2)

初始值即为 dp(0,i)=0,注意初始时需要将除了 0 之外的所有 sum 都初始化为 ,否则因为负权值可能存在一些不正确的转移。

Code

UPD

update-2023_01_14 初稿