动态规划

Posted lumasaevial

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划相关的知识,希望对你有一定的参考价值。

一、对动态规划的理解

  动态规划算法的思想为:当前问题的最优解必定是在子问题的最优解的基础上求得的,进而去求子问题的最优解,通过不断递归之后,由初始状态的最优解以自底向上的方式不断动态地得到当前问题的最优解。

二、编程题1、2的递归方程

  (1)编程题1的递归方程:

 1 for (int i = 0; i < n; i++) {
 2   note[i] = 1;//note数组初始化
 3    for (int j = 0; j < i; j++) {//note[i]记录list[i]作为单调递增子序列的最后一个元素的长度
 4      if (list[i] > list[j] && note[i] < note[j] + 1)
 5         note[i] = note[j] + 1;
 6    }
 7    if (i == 0) {
 8      Max[i] = 1;
 9       continue;
10    }
11    else {
12      Max[i] = note[i] > Max[i - 1] ? note[i] : Max[i-1];
13    }//Max[i]记录前i+1个元素组成的序列中单调递增最长子序列的长度
14 }

  定义两个辅助一维数组note,Max,在遍历list数组中,当前访问第i个元素时,遍历第一个元素到第i - 1个元素,更新note[i];再通过note[i]与Max[i - 1]填写Max[i]。

  最终Max[n - 1]的值即为所求问题的解。

  (2)编程题2的递归方程:

 1 for (int i = n - 1; i > 0; i--) {
 2     for (int j = i + 1; j < n + 1; j++) {
 3         min[i][j] = money[i][j];//初始化min数组
 4       for (int k = i + 1; k < j; k++) {
 5         //若第i站到第k站,再由第k站到第j站的价格小于min[i][j],更新min[i][j]
 6             if (min[i][k] + min[k][j] < min[i][j])
 7               min[i][j] = min[i][k] + min[k][j];
 8       }
 9     }
10 }

  定义一个二维辅助数组min[i][j],记录由第i站到第j站的最小价格。由上游第一站往下填写min数组,最终min[1][n]的值即为所求问题的答案。

三、结队编程情况

  本次结队编程为了加深各自对动态规划的理解,我们选择独立编程,编程完成或是遇见困难思考了一段时间后,再交流各自的思路,以及编程方法。总体来看,我们的思路基本一致,算法的编写方式稍有不同。


以上是关于动态规划的主要内容,如果未能解决你的问题,请参考以下文章

是否可以动态编译和执行 C# 代码片段?

动态规划_线性动态规划,区间动态规划

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

应对笔试手写代码,如何准备动态规划?

算法动态规划 ⑤ ( LeetCode 63.不同路径 II | 问题分析 | 动态规划算法设计 | 代码示例 )