福州DAY7(动态规划类型及其优化方式)

福州Day7之动态规划类型及其优化方式

1)动态规划

动态规划是运筹学的一种分支。

序列dp

在给定的序列上进行dp,并不只是一维。

两种编号状态:
1强制用到i

2不一定用到i

【最长上升子序列】

不一定要连续的串,但是要严格递增

f[i]指直到当前的最长上升子序列。

双重循环的时间为O(n2),只能做到一千左右。

优化:

需要满足:

1F[i]尽量大

2a[i]>a[j]

所以不能用线段树(线段树只能满足一个条件)。

F[i]表示长度为i的上升子序列的最小末位数字。选取末位数尽量小的数的方案更优。后面所可选取的数据范围越大(即所能选取数字的最小值越小)。所以只要查找到a[i]的时候,判断包括a[i]所能构成的长度为j在最长上升子序列,判断a[i]是否小于f[j]如果小于,则放入f[j]中,否则不做改变。改变f[j]不会对原记录数列进行影响。

【最长公共字串】

用f[i][j]表示匹配到A的第i位,B的第j位得到的最长公共子序列。

推出公式:

Ff[i-1][j-1]+1   (A[i]=B[j])

Max([i][j-1],f[i-1][j])   (A[i]<>B[j])

如果有更多的序列,对应增大维数即可。

背包问题

【0|1背包问题】

转移方程:

f[i][j]表示前i件物品空间为j的放入所能得的最大价值。

转移公式:

1.取第i件物品

2.不取第i件物品

f[i][j]=max(f[i-1][j],f[i][j-c[i]]+w[i]])

优化(二维转一维)

我们可以把i省略掉。

我们先思考从前往后取。从前往后,件数会不断累加。数据的件数不在是0|1而改为了无限的件数。所以这种方案是不可行的。

我们还可以从后往前取。从后往前后改变后面的数,前面的数不会影响,所以正解。

【完全背包问题】

完全背包即物品件数是无限的。

。每件物品的件数是无限件的,说明每件物品我们都可以重复取。我们在回顾0|1背包问题,发现我们在0|1背包中所思考的从前往后的方法正好符合了这一条件(物品件数无限)。

{这辆道题在以前的博客已经详细分析过}

【多重背包】

I件物品的件数是i件。

我们可以在多建一维储存件数。

但是我们又遇到了和0|1一样的问题。如果n过大会超时。

所以我们考虑二进制思想,把第i种物品换成若干件物品,进而转换为0|1问题。

我们可以用1(1),2(10),4(100),8(1000)合成其他的数(2n的数最高位是1)。说明在二进制的角度上来讲,我们用这2n来拆分所得次数最少。我们就可以按照2的次方进行拆分计算。

【混合三种背包】

我们先将0|1背包和多重背包合在一起(都有指定的件数)。

如果是0|1背包(多重背包),我们就倒序;如果是完全背包,我们就正序。

【例题——贝茜的奶酪塔】

我们先做一次没有大于k的进行一次0|1背包,再选择一个大于k的。将先前所有的变为4/5,再进行做0|1背包。

区间dp

(重点讲在二维的区间dp)

1.    序列:在[l,r]上寻找分割点在哪里,将左右的最优解化为自己的最优解。

2.    环:在结尾再复制一遍化作序列。

【乘法游戏】

F[i][j]表示区间i,j上的最优解。

公式:

f[i][j]=min{f[i][j],f[i][k]+f[k][j]+a[i]*a[k]*a[j]}(i<k<j)

k指当前的分割点。

第一层循环枚举区间长度(1~n),第二重循环枚举起始点,有了起始点,我们自然而然可以知道j,然后我们再循环k,这样我们可以保证每次都是从小到大。

状压dp

我们将状态去简化。再用运算加速dp

数据特殊性:数据比较小(例如,10)。

状态:
1选当前数字

2不选当前数字

更多地用在矩阵中。

2)常见的优化方式

1.    减少状态总数

跳过无用状态

变量相互制约

2.    减少状态转移数

预处理/前缀和

部分和优化

四边形不等式

决策单调性

数据结构优化

3.    内存优化

滚动数组

减少状态总数

预处理/前缀和优化:【最大子段和】

公式:

f[r]=max(f[r-1],0)+a[r]

拓展1【环状最长子段和】

转化为序列(在后面复制黏贴一段)。

拓展2【两段最长子段和】

题意:一段序列中可以取两段,求相加最大值。

枚举每一个分界点。

跳过无用状态:【青蛙过河】

f[i]表示青蛙在i上踩到的最小石子数。

当L=4,S=4,T=5时

可以跳到的点为

4,5,8,9,10,12,13,14,15,16,17,18,19,20.

我们发现,跳到某一个点之后,之后的所有点是都可以取的到的。所以,到它们的公倍数(前面部分也有可能)一定之后的每一点都能取到。

所以我们把所有距离大于ST的缩到ST,这样塔缩短的是非常大的。

变量相互制约:【乌龟棋】

F[I,a1,a2,a3,a4],

优化:
我们发现i是可以通过卡牌数量计算得到的,所以我们直接将这一维直接扔掉,这样我们就把五维数组转化为了四维数组。

猜你喜欢

转载自blog.csdn.net/qq_40681184/article/details/79313248
今日推荐