动态规划是把复杂问题分解为相对简单的子问题来求解,动态规划旨在解决具有重叠子问题和最优子结构特性的问题,它的核心思想是解决每个子问题仅能一次,并存储其解,以便需要时直接查找,从而避免重复计算
基本概念:
1.重叠子问题:
问题可以分解为多个子问题,且这些子问题有些会被多次计算.动态规划通过存储子问题的解来避免重复计算
2.最优子结构:
原问题的最优解可以通过其子问题的最优解组合得出.这意味着问题的最优解包含了其子问题的最优解
示例:
package a_od_test;
/*
斐波那契数列
0 1 1 2 3 5 ...示例1:
输入:
1
输出:
1示例2:
输入:
4
输出:
3解题思路:
递归法
动态规划法*/
public class Main34_Test {public static void main(String[] args) {//递归法
// int result = recursion(4);//动态规划法int result = dynamicProgramming(4);System.out.println(result);}public static int recursion(int n) {if (n <= 1) {return n;} else {return recursion(n - 1) + recursion(n - 2);}}public static int dynamicProgramming(int n) {if (n <= 1) {return n;}//先创建一个数组来保存历史数据int[] dp = new int[n + 1];//给出初始值dp[0] = 0;dp[1] = 1;//通过关系式来计算出dp[n]for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}//把最终结果返回return dp[n];}
}