这里是阿新的杂记 🍺
公众号同名
|

阿新的杂记

园龄:2年2个月粉丝:4关注:11

2023-01-05 11:16阅读: 55评论: 0推荐: 0

从最简单的线性DP开始

image

导读 ^ _ ^

线性DP可以说是最常见的DP问题。
从本期开始,我们将从最简单的线性DP开始学起。
后面同时更新一些经典的面试题带大家更加深入的学习线性DP

如何计算动态规划的时间复杂度?

状态数 x 转移次数

理解线性

按照某种线性关系进行线性的状态的转移。
image.png

数字三角形

image.png

思路

我们先对矩阵结构进行研究
image.png
推导公式:
image.png

代码实现

#include<iostream>
#include<algorithm>

using namespace std;

const int N=510,INF=-1e9;

int n;
int a[N][N];
int f[N][N];

int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) 
        for (int j = 1; j <= i; j++) 
             cin>> a[i][j];
             
    for (int i = 0; i <=n; i++) 
       for (int j = 0; j <= n+1; j++) 
            f[i][j] = INF;
    
    //记得初始化
    f[1][1] = a[1][1];
    for (int i = 2; i <= n; i++) 
       for (int j = 1; j <=i; j++) 
            f[i][j] = max(f[i-1][j] + a[i][j],f[i-1][j-1] + a[i][j]);
    
    int res = INF;
    for (int i = 1; i <= n; i++) res = max(res,f[n][i]);
    
    cout << res << endl;
    
    return 0;
}

总结

在学完上面的题,你一定对线性DP有了一些印象。
所谓线性dp,就是指我们的递归方程有一个明显的线性关系的,有可能是一维线性的,也可能是二维线性的。
就是我们在求dp的(动态规划)里面的每一个状态都是一个多维的状态。
多维状态有一个求的顺序,比如说背包问题,可以画出来一个矩阵,这个求的时候有一个明显的求的顺序,就是按行一行行地求,有一个明显的线性的顺序来求,这样的dp就被称为线性dp。所有这种递推顺序有一个模糊的线性的顺序的话,就被称为线性dp。
所有这种递推顺序有一个模糊的线性的顺序的话,就被称为线性dp。

谢谢你的观看!

本文作者:HX-Note

本文链接:https://www.cnblogs.com/HX-Note/p/17027020.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   阿新的杂记  阅读(55)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起