● 理论基础
解决动态规划需要知道:
1.dp数组以及下标的含义
2.递归公式
3.dp数组如何初始化
4.遍历顺序(为什么从前到后,为什么是从背包到物品)
5.打印dp数组(看是不是按照你的逻辑打印出来的数值)
主要是用来debug
● 509. 斐波那契数
1 1 2 3 5 8
dp[i]:第i个斐波拉契数
递推公式:dp[i] = dp[i-1]+dp[i-2];(意味要把第0个和第一个求出)
dp[0]=1;dp[1] = 1;
从前向后
class Solution { public int fib(int n) { int[] dp = new int[n+1]; dp[0]=0; if(n<1){ return 0; }//n=0也是一个测试点 dp[1] = 1; if(n<2){ return 1; } for(int i =2;i<=n;i++){ dp[i] = dp[i-1]+dp[i-2]; } return dp[n]; } }
● 70. 爬楼梯
class Solution { public int climbStairs(int n) { int[] dp = new int[n+1]; if(n<=2){ return n; } dp[1] = 1; dp[2] = 2; for(int i = 3;i<=n;i++){ dp[i] = dp[i-1]+dp[i-2]; } return dp[n]; } }
● 746. 使用最小花费爬楼梯
dp[i]:到达i位置最小花费为dp[i];
dp[i]:
dp[i-1]+cost[i-1];
dp[i-2]+cost[i-2];
dp[0] = 0;
dp[1] = 0;
class Solution { public int minCostClimbingStairs(int[] cost) { int[] dp = new int[cost.length+1]; //dp[i]是爬到第i层楼梯需要花费的最低花费 dp[0] = 0; dp[1] = 0; int len = cost.length; for(int i = 2;i<=cost.length;i++){ dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);//从低于自己的第一层和第二层爬 } return dp[len]; } }