选自知乎https://www.zhihu.com/question/39948290
能用动态规划解决的问题:
应用动态规划:将问题拆分成三个子目标
目标中有两个是涉及到代码层面上:
· 缓存中间结果,搞个数组等变量记录中间结果。
· 按顺序从小到大算,搞个for循环一次计算。
例子1-3:斐波那契数列(简单)
首先,我们可以很容易得到状态转移方程:
接下来我们用两种方法来做:
法一:简单递归
代码简单易懂,然而这代码却极其低效。空间复杂度高,时间复杂度更是高到
法二:动态规划
java:一定要注意索引是从0开始的。需要求第n个值,就是求res[n-1],初始化的时候还是n个数字。
public int fib(int n){
int[] res = new int[n];
for (int i=0;i<n;i++) {
if (i<2){
res[i] = i;
}else {
res[i] = res[i-1]+res[i-2];
}
}
return res[n-1];
}
例2-3:不同路径(难度:中等)
java:
public int uniquePaths(int m, int n){
int[][] res = new int[m][n];
//res[1][0] = res[0][1] = 1;
for (int i=0;i<m;i++) {
for (int j=0;j<n;j++) {
if (i==0 || j==0)
res[m][n] = 1;
else
res[m][n] = res[m-1][n] + res[m][n-1];
}
}
return res[m-1][n-1];
}
例题3-3:正则表达式匹配(困难)(待学习!!)