underthetwilight

DP

\[\large\text{动态规划(DP)} \]


\(1.\text{DP}\)的特点

\(“状态”\) 用于描述某种局面,\(\text{DP}\)的作用在于利用一个状态推出所有可能成为解的状态,而常与之相提并论的贪心算法则是每次只推出最优状态,不去考虑其他状态


\(2.\)状态设计

在不同的题目中往往有不同的状态设计,但核心都在于使用尽可能少的变量去记录所有 有后效性 的变量


\(3.\)转移

在明确状态之后,转移是自然的,一个\(\text{DP}\)的复杂度等于\(状态复杂度\times 转移复杂度\)

例如:对于一个状态\(f_{l,r}\),我去枚举中间点\(k\)作转移,复杂度为状态$O(n^2)\times $ 转移 \(O(n)=O(n^3)\)


\(4.\text{DP}\)优化

优化复杂度的本质就是优化状态和转移

\(\text{Case 1:}\)优化状态
常见的方法有:
\(1.\)重新设计状态:状态设计的巧妙与否深刻影响着转移的复杂度与题目的正确性
\(2.\)利用一些约束去用较少的量维护状态
本质上是去除不合法或不优的状态

例如:对于\(\text{LIS}\)问题中设计\(f_{i,j}\)表示前\(i\)个位置最后一个选\(j\)的最优解优化为\(f_i\)表示强制选\(i\)的最优解,但\(0-1\)背包的优化只优化了空间复杂度,并没有优化状态

\(\text{Case 2:}\)优化转移
\(1.\)性质优化转移:利用题目性质去优化转移方程
\(2.\)数据结构优化转移
\(3.\)单调性优化转移

例如:\(f_i=\sum_{j<i} f_j\)可以使用前缀和进行优化

\(\text{P11233 [CSP-S 2024] 染色}\)

我们考虑朴素的\(\text{DP}\),令\(f_i\)表示考虑前\(i\)个位置的最大价值
考虑我们有两个数\(i,j\) , \(i>j,a_i=a_j\)我们强制让这两个位置产生贡献
那么显然:\(i\rightarrow j\)中的所有位置都是一个颜色
那么在\(i\rightarrow j\)中的数产生贡献只有两种可能

\(\text{Case 1:}\exists k,a_k=a_{k+1}\),我们定义\(g_i\)表示区间\([1,i]\)上只有一种颜色时的最大贡献,那么此时\([j,i]\)区间的贡献即为\(g_i-g_j\)
总贡献\(f_j+a_i+g_i-g_j\)

\(\text{Case 2:}\)对于位置\(j+1\),它跨过位置\(j\)与前面的位置进行匹配,此时的贡献即为\(g_{i-1}-g_{j+1}\)
我们只要保证\([j+1,i-1]\)区间内的颜色一致,无论\(j\)的颜色是什么,我们总可以让\(i,j\)匹配,而且这个匹配的贡献是由\(i\)去提供的,所以我们若想计算\(j+1\)跨过\(j\)产生的匹配,只需使用\(f_{j+1}\)即可
总贡献:\(f_{j+1}+a_i+g_{i-1}-g_{j+1}\)

我们综合上述两种情况,我们发现\(\text{Case 1}\)总是被包含在\(\text{Case 2}\)中,于是我们可以只用\(\text{Case 2}\)进行转移

\[f_i=\max_{j<i,a_j=a_i} f_{j+1}+g_{i-1}-g_j+a_i \]

提取公共项

\[f_i=a_i+g_{i-1}+\max_{j<i,a_i=a_j} f_{j+1}-g_{j+1} \]

对于每一个\(a_i\)开一个变量记录前缀\(max(f_i-g_i)\)然后\(O(1)\)转移即可
注意如果\(a_{i-1}=a_i,f_i=f_{i-1}+a_i\)

\(\text{Code}\)

void solve(){
    g[0]=0;for(int i=1;i<=n;i++){
		if(a[i]==a[i-1]) g[i]=g[i-1]+a[i];//g[i]初始化
		else g[i]=g[i-1];
        f[i]=0;
	}
	for(int i=1;i<=n;i++){
		f[i]=f[i-1];
        f[i]=max(f[i],q[a[i]]+a[i]+g[i-1]);
        if(a[i]==a[i-1]) f[i]=max(f[i],f[i-1]+a[i]);
        q[a[i-1]]=max(q[a[i-1]],f[i]-g[i]);//注意原方程j+1->i,所以此处为i->i-1
	}
    cout<<f[n]<<"\n";
    for(int i=1;i<=n;i++) q[a[i]]=INT_MIN;
}

posted on 2026-10-30 10:27  Underthetwilight  阅读(5)  评论(0)    收藏  举报

导航