动态规划

时间:2021-05-30
本文章向大家介绍动态规划,主要包括动态规划使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

递归型

记忆递归型

优点:只经过有用的状态,没有浪费。递推型会查看一些 没用的状态,有浪费。

缺点:可能会因递归层数太深导致栈溢出,函数调用带来额外时间开销。总体来说,比递推型慢

递推型

“人人为我”递推型(推荐):在选取最优备选状态的值Fm,Fn,…Fy时, 有可能有好的算法或数据结构可以用来显 著降低时间复杂度

“我为人人”递推型:没有什么明显的优势,有时比较符合思考的习惯。个别特殊题目中会比“人人为我”型节省空间

问题

最长上升子序列

百炼2757
思路:假设第k个元素为子序列的最后一个元素(1<=k<=n)。那么只要k前面小于k的元素对应的最长子序列加一,找到最大的那个。

#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int n;
    int i,j;
    int A[1005],Max[1005];
    cin >> n;
    
    for (i=1; i<=n; i++)
    {
        cin >> A[i];
        Max[i]=1;       //每个元素,就算在它前面都比它大,那么它的最小长度就是它本身1
    }
   
    for (i=2; i<=n; i++) //求每次以i为终点的最长上升子系列长度
        for(j=1;j<i;j++)    //查看以第j个数为终点的最长上升子序列
            if(A[i]>A[j])
                Max[i]=max(Max[i],Max[j]+1);
    cout << *max_element(Max+1,Max+n+1)<<'\\n';
    return 0;
}

第一讲 01背包问题 · 背包问题九讲 · 看云

原文地址:https://www.cnblogs.com/tzfs/p/14828924.html