上接背包问题
动态规划的基本步骤:
- 最优子结构性质:找出最优解的性质,并刻画其结构特征;
- 建立递归关系:递归地定义最优值;
- 计算最优值:以自底向上的方式计算出最优值;
- 构造最优解:根据计算最优值时得到的信息,构造最优解。
上面说到我们在分析动态规划的时候,一定要分析到造成动态规划的数组变动的参数是什么?
我们看一下LeedCode第746题:
我们先要知道我们的dp[]数组代表什么:dp[i]表示跳到第i个位置的时候所需要花费的最小体力。
那么dp[i]是怎么来的呢?
题意说,我们可以一次爬一个阶梯或者爬两个阶梯,所耗费的体力就是起跳点的值
所以dp[i]是由dp[i-2]+a[i-2]和dp[i-1]+a[i-1]中的较小值来确定的
所以递归关系为:
dp[i] = Math.min(dp[i - 2] + a[i - 2], dp[i - 1] + a[i - 1]);
从而很容易就得到最后的结果,代码如下:
package com.lmm.LeedCode;
/**
* @author lmm E-mail:violet_mmhh@163.com
* @time 时间:2019年7月2日
* @function 功能:Leedcode746题,使用最小花费爬楼梯
* @question 问题描述:
*/
public class Solution0746 {
public static int getAnswer(int[] a) {
int n = a.length + 1;
int[] dp = new int[n];
for (int i = 2; i < n; i++) {
dp[i] = Math.min(dp[i - 2] + a[i - 2], dp[i - 1] + a[i - 1]);
}
return dp[n - 1];
}
public static void main(String[] args) {
int[] a = { 1, 100, 1, 1, 1, 100, 1, 1, 100, 1 };
System.out.println(getAnswer(a));
}
}
结果如下
是