动态规划DP
拆分子问题,记住过程,减少重复运算。
常见例子:
-
背包问题
-
凑零钱问题
-
爬楼梯
-
数字三角形
-
递归
爬楼梯例子
简单介绍一下题,你要爬楼梯,每一次只能爬一个或两个
你爬了n个楼梯,那么总共有多少种爬法呢?有三种解法
简单递归 O(N*N)
不足:有大量重复运算
例 a3=a2+a1 a4=a3+a2
package com.dd.study.dayTest;
public class Test {
private int clime(int n){
if(n==1){
return 1;
} else if (n==2) {
return 2;
}
else return clime(n-1)+clime(n-2);
}
public static void main(String[] args) {
Test test1 = new Test();
System.out.println(test1.clime(5)+"种爬法");
}
}
HashMap
这种方法储存了每次的结果,可以在map里找,减少了重复运算
package com.dd.study.dayTest;
import java.util.HashMap;
public class Test {
private HashMap<Integer,Integer>hashMap=new HashMap<>();
private int clime(int n) {
if(n==1){
return 1;
}
if (n==2) {
return 2;
}
if (hashMap.get(n)!=null) {
return hashMap.get(n);
}
else {
int result=clime(n-1)+clime(n-2);
hashMap.put(n,result);
return result;
}
}
public static void main(String[] args) {
Test test1 = new Test();
System.out.println(test1.clime(5)+"种爬法");
}
}
自底向上的动态规划
package dayTest;
public class Test1 {
private int clime(int n){
int pre=2;
int prepre=1;
int result=0;
if(n==1){
return 1;
}
if (n==2) {
return 2;
}
for(int i=3;i<=n;i++){
result=pre+prepre;
prepre=pre;
pre=result;
}
return result;
}
public static void main(String[] args) {
Test1 test1 = new Test1();
System.out.println(test1.clime(5)+"种爬法");
}
}