今天我来浅谈一下区间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$,也就是说这段代码的时间复杂度为$Oleft(frac{n^2}{2} ight)$。
不过,其实你如何枚举都是这个时间复杂度,所以完全可以根据自己的喜好、习惯来写。
其实我还没有说什么就已经写了一大段了,所以说这只是浅谈而已,不过,放心好了,我以后还会更新的,就到这里吧