L4933 线性dp
d
p
[
i
]
[
j
]
dp[i][j]
d p [ i ] [ j ] 以第
i
i
i 座塔为结尾公差为
j
j
j 的答案数无需遍历公差,
n
2
n^2
n 2 遍历两座塔则公差已确定 公差可能为负,先变成正数
转移方程
for ( int i= 1 ; i<= n; i++ )
for ( int j= 1 ; j< i; j++ ) {
int lop= h[ i] - h[ j] + Max;
dp[ i] [ lop] += dp[ j] [ lop] + 1 ;
dp[ i] [ lop] %= MOD;
}
L5858 线性dp
d
p
[
i
]
[
j
]
dp[i][j]
d p [ i ] [ j ] 放进
i
i
i 原料此时共有
j
j
j 种原料最佳答案
d
p
[
i
]
[
j
]
=
m
a
x
(
d
p
[
i
−
1
]
[
k
]
+
j
∗
a
[
i
]
)
dp[i][j]=max(dp[i-1][k]+j*a[i])
d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ k ] + j ∗ a [ i ] ) ,
j
−
1
≤
k
≤
j
+
k
−
1
j-1\leq k \leq j+k-1
j − 1 ≤ k ≤ j + k − 1 区间最值单调队列优化
转移方程
for ( int i= 1 ; i<= n; i++ )
{
for ( int j= 1 ; j<= min ( w, s) ; j++ )
{
while ( ! Q[ i- 1 ] . empty ( ) && dp[ i- 1 ] [ j] > dp[ i- 1 ] [ Q[ i- 1 ] . front ( ) ] )
Q[ i- 1 ] . pop_front ( ) ;
if ( dp[ i- 1 ] [ j] != ~ INF)
Q[ i- 1 ] . push_front ( j) ;
}
for ( int j= 1 ; j<= min ( i, w) ; j++ )
{
while ( ! Q[ i- 1 ] . empty ( ) && Q[ i- 1 ] . back ( ) < j- 1 )
Q[ i- 1 ] . pop_back ( ) ;
dp[ i] [ j] = max ( dp[ i] [ j] , dp[ i- 1 ] [ Q[ i- 1 ] . back ( ) ] + ( LL) j* a[ i] ) ;
if ( j+ 1 + s- 1 <= w)
{
while ( ! Q[ i- 1 ] . empty ( ) && dp[ i- 1 ] [ ( j+ 1 ) + s- 1 ] > dp[ i- 1 ] [ Q[ i- 1 ] . front ( ) ] )
Q[ i- 1 ] . pop_front ( ) ;
if ( dp[ i- 1 ] [ ( j+ 1 ) + s- 1 ] != ~ LINF)
Q[ i- 1 ] . push_front ( ( j+ 1 ) + s- 1 ) ;
}
}
}