tj:80pts:維護f[i][j]表示當前第i個方塊必須選,且選了j個的最優解,設w[i]為第i個方塊長度
則可以枚舉上次選了第k個方塊,則f[i][j]=max{f[k][j-1]+w[i]*(i-k)}
初值:f[i][1]=w[i]*i
100pts:記g[i]表示f[i][j-1],f[i]表示f[i][j],考慮每一次用g[i]得到f[i],首先將f數組清空
初值依然如上
考慮以前可以用來更新現在答案的2個點j,k什麼時候j比k優(k<j)" role="presentation" style="position: relative;">(k<j)(k<j),則g[j]+w[i]∗(i−j)>g[k]+w[i]∗(i−k)" role="presentation" style="position: relative;">g[j]+w[i]∗(i−j)>g[k]+w[i]∗(i−k)g[j]+w[i]∗(i−j)>g[k]+w[i]∗(i−k)
g[j]−w[i]∗j>g[k]−w[i]∗k" role="presentation" style="position: relative;">g[j]−w[i]∗j>g[k]−w[i]∗kg[j]−w[i]∗j>g[k]−w[i]∗k
所以g[j]−g[k]>w[i]∗(j−k)" role="presentation" style="position: relative;">g[j]−g[k]>w[i]∗(j−k)g[j]−g[k]>w[i]∗(j−k) 除過去得到(g[j]−g[k])/(j−k)>w[i]" role="presentation" style="position: relative;">(g[j]−g[k])/(j−k)>w[i](g[j]−g[k])/(j−k)>w[i]
w[i]單調不增,考慮斜率優化,維護一个斜率單調遞減的隊列,保證其中所有斜率小於w[i],當sl(q[h],q[h+1])>w[i]時pop掉q[h]
相关文章
- 01-01jzoj5347