思路(4 层 DP)
设砖块数组为 B[0..N-1],要选下标严格递增的 i0<i1<i2<i3,最大化:
A0*B[i0] + A1*B[i1] + A2*B[i2] + A3*B[i3]
做递推:
* dp0[i]:只选 1 块,且最后一块选在 i 的最大分
dp0[i] = A0*B[i]
* dp1[i]:选 2 块,且第二块选在 i
dp1[i] = max_{j<i}(dp0[j]) + A1*B[i]
* dp2[i]:选 3 块,且第三块选在 i
dp2[i] = max_{j<i}(dp1[j]) + A2*B[i]
* dp3[i]:选 4 块,且第四块选在 i
dp3[i] = max_{j<i}(dp2[j]) + A3*B[i]
关键是维护前缀最大值:
best0 = max(dp0[0..i-1]),best1,best2,一路扫一遍就行。
注意:
* Ai, Bi 可能为负,所以初始必须是 -INF,不能用 0(样例2会错)。
* 用 long long。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考代码