美文网首页
3. Dynamic Programming

3. Dynamic Programming

作者: MangoDai | 来源:发表于2017-09-23 15:56 被阅读0次

Think

  1. Lot of start,end
    Every stey have associative and we need solve small question to big question.Finaly, subquestion is atomic question.Every subquestion of value hava dependent relative,what to use result to provide back subquestion.

Design

  1. Make sure subquestion border
  2. Optimize recusive equations
  3. Attention cut position

Step

  1. 引入参数来界定子问题的边界
  2. 判断该优化问题是否满足优化原则
  3. 注意子问题的重叠程度
  4. 分析子问题的之间依赖关系
  5. 采用自底向上的实现技术
  6. 利用备忘录和标记函数通过追溯得到最优解
  7. 动态规划算法的时间复杂度与子问题个数计算的工作量
  8. 由于备忘录来存储中间结果,往往需要使用较多的储存空间至于规模较大的问题,就成为性能的瓶颈

Implement

  1. Use Recursion
    for(int r = 2; r <= n; r++) { // chain of length [0 - n]  子问题划分 
        for(int i = 1; i <= (n-r+1); i++) { //  n-1+1 遍历其中的元素 
            int j = i + r -1; // j = 1 + 2 - 1 = 2 // 从子问题起始点 
            m[i][j] = m[i+1][j] + data[i-1]*data[i]*data[j];  // 计算当前数据 data[0]data[1]data[2] +m[2,2] = 优化值 m[1,2]
            s[i][j] = i; //s[i][j] = i;  标记元素 = 坐标 记录分割位置 s[1,2] = 1
            for(int k = i + 1; k <= j - 1; k++) { // 寻找其他划分 k = 2 < 2 - 1 
                int t = m[i][k] + m[k+1][j] + data[i-1]*data[k]*data[j]; // 前面的 + 后面的 + 相乘数据
                if (t < m[i][j]) {
                    m[i][j] = t;
                    s[i][j] = k;
                }
            }
        }
    }
  1. Use Iterative
int recur(int* data,int i, int j) {
    if (i == j) { // 递归到最小单元 如 data[1][1] = 0; data[1][1]=1
        m[i][j] = 0;
        s[i][j] = i;
        return m[i][j]; 
    }
    m[i][j] = 1 << 30; // 该i到j 赋予最大值
    s[i][j] = i; // 分割点在i
    for (int k = i; k <= j-1; k++) { // 从i到j-1开始递归处理求最小值,在加上整体数据
        int q = recur(data, i, k) + recur(data, k+1, j) + data[i-1]*data[k]*data[j]; //data[0]*data[k]*data[j]
        if (q < m[i][j]) {
            m[i][j] = q;
            s[i][j] = k;
        }
    }
    return m[i][j];
}

相关文章

  • 3. Dynamic Programming

    Think Lot of start,endEvery stey have associative and we ...

  • Chapter 4

    Chapter 4: Dynamic Programming Dynamic programming comput...

  • 18/10/2019 Lecture3: Planning by

    Planning by Dynamic Programming Dynamic Programming 具有某种时...

  • 动态语言/静态语言/动态类型语言/静态类型语言的差异

    动态语言(dynamic programming language): programming behaviors...

  • Dynamic Programming

    研究生学过DP,当时觉得还挺简单的,就是从初始状态开始,找到推导公式一步步往下推嘛。但实际刷题时发现DP还是很难的...

  • dynamic programming

    本质 : 记忆化搜索避免重复计算 多重循环vs记忆化搜索多重循环:可以不用递归 可以对空间复杂度进行优化 步骤:初...

  • Dynamic Programming

    planning all the time.Find a polynomial time. 动态规划背后的基本思想...

  • Dynamic Programming

    70. Climbing Stairs : Easy198. House Robber : Easy121. ...

  • Dynamic programming

    本文针对两篇优秀动态规划文章中存在的不易理解的部分:状态、状态转移的定义和状态转移方程的编程实现部分进行个人解读。...

  • Dynamic Programming

    DP 基本有两个模板: 自上而下:先有最初的结果,求出最后的结果。 自下而上: 先有最后的结果,然后求出最初的结果...

网友评论

      本文标题:3. Dynamic Programming

      本文链接:https://www.haomeiwen.com/subject/rhlzsxtx.html