D P DP DP浅谈
- 由于窝太菜了,只好写这篇浅谈来聊以自慰。
那么我们从最简单的 D P DP DP入门开始吧
【一】基础 D P DP DP
( I ) l i s (I)\ \ lis (I) lis一个最基础的 D P DP DP入门题。
-
状态: f i f_i fi表示到 i i i的 l i s lis lis长度
-
转移: f i = max ( f j + 1 ) ( a j ≤ a i ) f_i=\max\ (f_j+1)\ \ (a_j\leq a_i) fi=max (fj+1) (aj≤ai)
-
答案统计: max f i \max \ f_i max fi
-
因为我们在更新 i i i时要找到最大的 f j f_j fj来更新答案使得答案最优。这样的复杂度是 O ( n 2 ) \ O(n^2) O(n2)
-
但是我们可以在 O ( n log n ) \ O(n \log n) O(nlogn)的时间内完成,此时可以用树状数组来维护。这里来讲一下用树状数组来维护。此时只要利用简单的区间求最值以及区间加就能完成。
-
随便再来几道线性 D P DP DP:
( 1 ) (1) (1) 例题一:CF711C
-
这算是一道比较简单的 D P DP DP题
f i , j , k f_{i,j,k} fi,j,k表示表示前i颗树已经分成k组,第i颗树的颜色是j的情况花费的最小费用。
转移也很简单(就是思考这个状态可以由哪些状态转移过来就行了)
当 a i a_i ai确定的时候:
f i , a i , k = m a x ( f i , a i , k , f i − 1 , j , k − 1 ) ( j ! = a [ i ] ) f_{i,a_i,k}=max(f_{i,a_i,k},f_{i-1,j,k-1})\ \ (j!=a[i]) fi,ai,k=max(fi,ai,k,fi−1,j,k−1) (j!=a[i])
f i , a i , k = m a x ( f i , a i , k , f i − 1 , j , k ) ( j = = a [ i ] ) f_{i,a_i,k}=max(f_{i,a_i,k},f_{i-1,j,k})\ \ (j==a[i]) fi,ai,k=max(fi,ai,k,fi−1,j,k) (j==a[i])
当 a i a_i ai不确定的时候:
f i , j , k = m a x ( f i , j , k , f i − 1 , h , k − 1 + w i , j ) ( j ! = h ) f_{i,j,k}=max(f_{i,j,k},f_{i-1,h,k-1}+w_{i,j})\ \ (j!=h) fi,j,k=max(fi,j,k,fi−1,h,k−<