动态规划算法

浅浅的花香味﹌ 2023-06-08 06:46 42阅读 0赞

动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。

  1. 动态规划的基本思想
    将原问题划分为子问题,以自底向上的方式求解问题对所有已经求解的子问题,动态规划法将子问题的解记录到表格中,求解较大的子问题时,一旦要用到已求解的较小子问题的解,就返回表格中已常数时间查询较小子问题的解并直接使用。
  2. 动态规划法的基本要素
    最优子结构性质与子问题重叠性质。
  3. 动态规划法的基本步骤
    1)分析问题的最优解性质,刻画最优解的结构特征。
    2)建立最优值的递归定义。
    3)以自底向上的方式计算出最优值。
    4)构造问题的最优解。
  4. 分类与举例
    动态规划一般可分为线性动规,区域动规,树形动规,背包动规四类。
    举例:
    线性动规:拦截导弹,合唱队形,挖地雷,建学校,剑客决斗等;
    区域动规:石子合并, 加分二叉树,统计单词个数,炮兵布阵等;
    树形动规:贪吃的九头龙,二分查找树,聚会的欢乐,数字三角形等;
    背包问题:01背包问题,完全背包问题,分组背包问题,二维背包,装箱问题,挤牛奶(同济ACM第1132题)等;
    应用实例:
    最短路径问题 ,项目管理,网络流优化等;
    举例:最长公共子序列
    递归定义最优解:
    在这里插入图片描述

代码实现:

  1. public static int lcsLength(char[] x,char[] y,int[][] b) {
  2. //构造矩阵大小
  3. int m = x.length+1;
  4. int n = y.length+1;
  5. int[][] c = new int[m][n];
  6. //初始化边界
  7. for(int i=0;i<m;i++)
  8. c[i][0] = 0;
  9. for(int i=0;i<n;i++)
  10. c[0][i] = 0;
  11. for(int i=1;i<m;i++) {
  12. for(int j=1;j<n;j++) {
  13. if(x[i-1] == y[j-1]) {
  14. c[i][j] = c[i-1][j-1] + 1;
  15. b[i][j] = 1;
  16. }
  17. else {
  18. if(c[i-1][j] > c[i][j-1]) {
  19. c[i][j] = c[i-1][j];
  20. b[i][j] = 2;
  21. }
  22. else {
  23. c[i][j] = c[i][j-1];
  24. b[i][j] = 3;
  25. }
  26. }
  27. }
  28. }
  29. return c[m-1][n-1];
  30. }
  31. public static void lcs(int i,int j,char[] x,int[][] b) {
  32. if(i==0||j==0)
  33. return;
  34. if(b[i][j] == 1) {
  35. lcs(i-1,j-1,x,b);
  36. System.out.println(x[i-1]);
  37. }
  38. else if(b[i][j] == 2)
  39. lcs(i-1,j,x,b);
  40. else
  41. lcs(i,j-1,x,b);
  42. }

发表评论

表情:
评论列表 (有 0 条评论,42人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态规划算法

    一:动态规划算法 1:动态规划算法介绍 1) 动态规划(Dynamic Programming)算法的核心思想是:将大问题划分为小问题进行解决,从而一步步获

    相关 动态规划算法

           动态规划方法是对解最优问题的一种方法,一种途径,并不是一种特殊的算法。        执行步骤:                1. 找出最优解的性质,刻画结