[C++]线性模型和递推

最大子段和

定义f[i]f[i]f[i]为结尾为第iii个元素的最大子段和
f[i]=max(f[i−1]+a[i],a[i])f[i]=max(f[i-1]+a[i],a[i])f[i]=max(f[i1]+a[i],a[i])
边界条件为f[0]=0f[0]=0f[0]=0
最终答案为f[n]f[n]f[n]

也可以转换成前缀和,求出前缀和和前面的前缀和的最小值做差

最长上升子序列(LIS)

定义f[i]f[i]f[i]为以iii结尾的LIS长度
f[i]=max(f[j])j<ia[j]<a[i]f[i]=max(f[j]) j<i a[j]<a[i]f[i]=max(f[j])j<ia[j]<a[i]
边界条件为f[0]=1f[0]=1f[0]=1
最终答案为f[n]f[n]f[n]

最长公共子序列(LCS)

定义f[i][j]f[i][j]f[i][j]a[1...i]a[1...i]a[1...i]b[1...j]b[1...j]b[1...j]的LCS的长度
f[i][j]=a={f[i−1][j−1]+1,a[i]=b[j]max(f[i−1][j],f[i][j−1],a[i]≠b[j])f[i][j]=a=\left\{\begin{array}{l}f[i-1][j-1]+1,a[i]=b[j]\\max(f[i-1][j],f[i][j-1],a[i]≠b[j])\end{array}\right.f[i][j]=a={f[i1][j1]+1,a[i]=b[j]max(f[i1][j],f[i][j1],a[i]=b[j])
边界条件为f[0][0]=0f[0][0]=0f[0][0]=0
最终答案为f[n][m]f[n][m]f[n][m](nnn为数组aaa的长度,mmm为数组bbb的长度)

递推与动态规划

事实上,递推是一种解决问题的方法,而动态规划常常会利用问题的最优子结构以及无后效性特征将问题转化为用递推求解。
一般来说,递推是从规模较小的问题推广向规模较大的问题,而动态规划也可以使用记忆化搜索来规避递推的顺序。
无论是递推还是动态规划,我们总是要进行一个状态的划分,然后在确定了边界条件之后进行状态的转移。只要掌握了这样解决问题的方式,不必纠结应该怎样去界定问题的类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值