算法导论——区间DP

今天我来浅谈一下区间DP

常见的区间DP有一定的范围,例如$f[i][j]$表示从i到j的最长上升子序列的长度

这里,由于这个值是唯一的,所以可以这么记录。

那么一般的区间DP的动态转移方程是怎样的呢?

其实这个并不固定,需要视题目而定,毕竟随机应变才是真本事

一般的区间DP的循环与常规DP不同,大致是这样:

for(int k=0;k<=n-1;k++)
    for(int i=1;i<=n-k;i++)
        int j=i+k;
        ...

这段代码的重点在于枚举的是区间长度和区间起点

有同学可能会问了:为什么要这么枚举呢?

可以这么理解:当$k=0$时,$i=1-n$,而当$k=n-1$时,$i=1$,当$k=\frac{n}{2}$时, $i=\frac{n}{2} -n$,也就是说这段代码的时间复杂度为$O\left(\frac{n^2}{2}\right)$。

不过,其实你如何枚举都是这个时间复杂度,所以完全可以根据自己的喜好、习惯来写。

其实我还没有说什么就已经写了一大段了,所以说这只是浅谈而已,不过,放心好了,我以后还会更新的,就到这里吧

猜你喜欢

转载自www.cnblogs.com/dbzrjr/p/suanfadp.html
今日推荐