动态规划模板
算法原理
- 做动态规划的题目,一般会先创建一个一维数组 dp,称之为 dp 表
- 我们想办法填满这个 dp 表,里面的某个值就是最终结果
采用动态规划,一般分五步:
- 状态表示
- 是什么?
- dp 表中每一个值所表示的含义就是状态表示(通俗解释)
- 怎么来?(非常重要)
- 题目要求
- 经验 + 题目要求(多做题)
- 分析问题的过程中,发现重复子问题
- 是什么?
- 推导状态转移方程
- dp[i] 等于什么,方程就是什么
- 初始化
- 保证填表的时候不越界
- 根据状态转移方程进行填表
- 填表顺序
- 为了填写当前状态的时候,所需要的状态已经计算过了
- 返回值
- 题目要求 + 状态表示
代码编写
- 创建 dp 表
- 初始化
- 填表
- 返回值
1. 第 N 个泰波那契数
题目解析
Tn等于前三项之和
算法思路
- 状态表示:
- 本题直接通过题目要求可知——>dp[i] 表示第 i 个泰波那契数的值
- 根据状态表示推导状态转移方程:
dp[i] = dp[i-1]+dp[i-2]+dp[i-3]- 依赖对象:
dp[i]依赖的是前三个状态 - 如何依赖:前三个状态之和
- 依赖对象:
- 初始化:
dp[0]=0 dp[1]=dp[2]=1 - 填表顺序:
从左向右 - 返回值:
dp[n]
代码编写
/**
* 求第 N 个泰波那契数
* @param n
* @return
*/
public int tribonacci(int n) {
// 1. 创建 dp 表
int[] dp = [n + ];
(n == ) ;
(n == || n == ) ;
dp[] = ;
dp[] = dp[] = ;
( ; i <= n; i++) {
dp[i] = dp[i - ] + dp[i - ] + dp[i - ];
}
dp[n];
}


