递归模板 public void recur (int level,int param){ //终止逻辑 if(level>MAX_LEVEL){ return; } //处理本层 process(level,param); //递归 recur(level+1,newParam); }
动态规划与递归分治没有本质区别(看有无最优子结构)
找到重复子问题,动态规划可以淘汰中途次优解
leetcode 509
public int fib(int n) { if(n<=0){ return 0; }else if(n==1) { return 1; }else { return fib(n-1)+fib(n-2); } }
指数级代码有许多重复计算
if(n<=1){ return n; } if(mem[n]==0){ mem[n]=fib(n-1)+fib(n-2); } return mem[n];
用数组mem记录递归产生的叶子节点,如果已经计算过不再重复计算
改为循环
a[0]=0
a[1]=1
for(int i=2;i<=n;i++){
a[i]=a[i-1]+a[i-2]
}
return a[n]
二维 路径取舍
leetcode 63
if(a[i,j]==0){
opt [i,j]=opt[i+1,j]+opt[i,j+1]
}else{
opt[i,j]=0;
}
1 找最优子结构
2 储存中间状态opt[i]
3 dp方程