dp(动态规划)

2动态规划步骤

1.状态表示 

dp表里面的值的含义

一般有两种表示 

1从起到开始到i位置的+题目要求

2从i位置到结尾+题目要求

也可能在dp[i]位置有多种状态 

根据不同状态可划分f[i],g[i] 或二维数组


2状态转移方程


dp[i]等于什么


3初始化

1
处理边界情况

2加入虚拟节点

        1保证在填表时,所需状态已经计算过了

        2下标映射(往往题目给予除dp[j]外的如cost[j])

        不一定增加节点就要映射 向右下增加节点不用管


4填表顺序


保证在填表时,所需状态已经计算过了


5返回值


题目要求+状态表示

实操


1创建dp表

2初始化
3填表
4返回值

2题目

一斐波那契数列模型

1第 N 个泰波那契数

1137. 第 N 个泰波那契数 - 力扣(LeetCode)

1.状态表示 
  1.dp[i]表示:+题目要求
dp[i]表示第i个泰波那契数
 
2状态转移方程
dp[i]等于什么
 dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

3初始化
处理边界情况
dp[0]=0;dp[1]=1;dp[2]=1;
4填表顺序
保证在填表时,所需状态已经计算过了从左到右

5返回值
题目要求+状态表示d[n]即题目要求

class Solution1 {
public:
	int tribonacci(int n) {
		//1创建dp表
		vector<int> dp(n + 1);//由于要返回dp[n]的值所以创建n+1的dp表
		//2初始化
		// 
		//注意边界情况
		//n==0,1,

		if (n == 0)return 0;//处理边界情况时要提前return 否则后面会越界
		if (n == 2 || n == 1)return 1;

		dp[0] = 0;
		dp[1] = 1;
		dp[2] = 1;
		//3填表
		for (int i = 3;i <= n;i++)//注意开始条件 和结束条件 不是n==0
		{
			dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3];
		}
		//4返回值
		return dp[n];
	}
};


空间优化:滚动数组


当填dp表时只需要某一个状态的前几个状态
赋值方向

class Solution2 {
public:
	int tribonacci(int n) {
		if (n == 0)return 0;
		if (n == 2 || n == 1)return 1;
		int a = 0;int b = 1;int c = 1;int d = 0;

		for (int i = 3;i <= n;i++)
		{
			d = a + b + c;
			//赋值方向:左到右
			a = b;b = c;c = d;
		}
		return d;
	}
};

 2 斐波那契数

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值