目录
Divide&Conquer + optimal substructure
Divide&Conquer + optimal substructure
1.动态规划和递归或者分治没有根本上的区别(关键看有无最优子结构)
2.共性:找到重复子问题
3.差异性:最优子结构,中途可以淘汰次优解
动态规划关键点
1.最优子结构
2.存储中间状态
3.递推公式(美其名曰:状态转移方程或者dp方程)
题目一:斐波那契数
(题目链接:https://leetcode-cn.com/problems/fibonacci-number/)
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给你 n ,请计算 F(n)
思路:使用动态规划即动态递推
class Solution {
public int fib(int n) {
if(n < 2){return n;}
int a = 0;
int b = 1;
int sum = 0;
for(int i =2;i<=n;i++){
sum = a+b;
a = b;
b = sum;
}
return sum;
}
}
题目二:不同路径
(题目链接:https://leetcode-cn.com/problems/unique-paths/)
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
思路:从出发点有两种方案推进:1)要么往右走一步;2)要么往下走一步
也就是说每一个格子有多少种方案等于它右边格子的方案+它下面格子方案之和。