数据结构学习笔记——第一章:绪论(下)

2019-07-14  本文已影响0人  吃远

五、动态规划

5.1 什么是动态规划

  所谓动态规划,可以理解为先通过递归找出算法的本质,并给出一个初步的解之后,再将其转化为等效的迭代的形式。

int fib(int n){
    return n<2 ?
        n : fib(n-1) + fib(n-2);
}
5.2 最长公共子序列(LCS)问题
Fig. 2 LCS示意
5.2.1 求解:
//string lcs(string &A, string &B){
//error: invalid initialization of non-const reference of type ‘std::__cxx11::string& {aka std::__cxx11::basic_string<char>&}’ from an rvalue of type ‘std::__cxx11::basic_string<char>’
//         return lcs(A.substr(0, m), B.substr(0, n)) + A[m];
//         A.substr(0,m)为临时变量, c++中临时变量不能作为非const的引用参数, 因为修改一个临时变量是无意义的。
//         https://blog.csdn.net/kongying168/article/details/3864756
//
string lcs(string A, string B){
    int m = A.size()-1;
    int n = B.size()-1;
    if (m==-1 | n==-1){
        return string();
    }
    if (A[m]==B[n]){
        return lcs(A.substr(0, m), B.substr(0, n)) + A[m];
    }
    else{
        string lcsL = lcs(A.substr(0, m), B);
        string lcsR = lcs(A, B.substr(0, n));
        return
            lcsL.size() > lcsR.size() ? lcsL : lcsR;
    }
}
5.5.2 性能分析
Fig. 4. 大量重复唤醒的实例极大提高了开销
上一篇 下一篇

猜你喜欢

热点阅读