1.原理

基本思想:问题的最优解如果可以由子问题的最优解推导得到,则可以先求子问题的最优解,在构造原问题的最优解,若子问题有较多的重复出现,则可以自底向上从最终子问题向原问题逐步求解。
使用条件:可分为多个相关子问题,子问题的解被重复使用。
动态规划算法的设计步骤:
1.分析优化解得结构
2.递归的定义最优解的代价
3.自上而下的计算优化解的代价保存,并获得构造最优解的信息
4.根据构造最优解的信息构造优化解。
动态规划特点:
1.把原始问题划分成一系列子问题
2.求解每个子问题仅一次,并将其结果保存在一个表中,以后用到时直接存取,不重复计算,节省计算时间
3.自底向上地计算。
4.整体问题最优解取决于子问题的最优解(状态转移方程)(将子问题称为状态,最终状态的求解归结为其他状态的求解)

2.实例

1.两个字符串最大的公共字符串

  1. public static String LCS(String str1, String str2){
  2. /**
  3. * 基本思路:
  4. * 1.取一个字符串开始遍历
  5. * 2.取两个字符串遍历
  6. */
  7. StringBuilder sb = new StringBuilder();
  8. int start = 0, end = 1;
  9. while (end < str1.length() + 1) {
  10. if (str2.contains(str1.substring(start, end))) {
  11. //保证下一步的公共字符串大于上一步公共字符串
  12. if (sb.length() < end - start) {
  13. sb.delete(0, sb.length());
  14. sb.append(str1, start, end);
  15. }
  16. end++;
  17. } else {
  18. start++;
  19. }
  20. }
  21. if (sb.length() == 0) {
  22. return "-1";
  23. }
  24. return sb.toString();
  25. }