当前位置: 首页 > news >正文

蓝桥杯备考:动态规划入门题目之下楼梯问题

按照动态规划解题顺序,首先,我们要定义状态表示,这里根据题意f[i]就应该表示有i个台阶方案总数

第二步就是 确认状态转移方程,画图分析

所以实际上f[i] 也就是说i个台阶的方案数实际上就是第i-1个格子的方案数+第i-2个格子的方案数+第i-3个格子的方案数,所以状态转移方程就是f[i]=f[i-1]+f[i-2]+f[i-3]

下一步就是我们的初始化,我们的初始化要遵循两个要求,1是保证填表正确,2是不越界

如果我们从0,1,2开始填的话下标会越界 所以我们就把0,1,2三个格子初始化,f[0]是1还是0呢?f[0]就是没有台阶,我们是算一种方案还是算0种方案呢,我们先不管他,我们先看1 一个台阶上的方案只有一个,f[1]  = 1   再看2  2个台阶上的方案无非就是一个格子一个格子上 和两个格子一起上,方案是2 个 f[2] = 2  我们再看一下3,3的台阶上的方案如图,很明显是四个,所以我们f[0]应该填1

下一步就是确认填表顺序了,我们应该从第三个开始填,从左到右

废话不说我们来实现一下我们的代码

#include <iostream>
using namespace std;
typedef long long LL;
const int N = 600;
LL f[N];
int main()
{
	f[0] = 1;f[1] = 1;f[2] = 2;
	LL n; cin >> n;
	for(LL i = 3;i<=n;i++)
	{
		f[i] = f[i-1]+f[i-2]+f[i-3];
	}
	cout << f[n] << endl;

}

代码很简单,和斐波那契数列特别像,也可以说它是一个斐波那契模型

但是!我们可以对空间进行一些优化,虽然我们比赛里空间不是大事儿,但是!后面在学背包的时候,我们的空间的优化对时间也能优化

与其用数组,其实我们可以用若干变量来完成我们的代码,就不用再开数组了

如图,我们令t=a+b+c 然后让c变成t,但是又不能直接把c赋给t,我们要把abc整体向右边挪动一位,我们应该先把b=c ,然后a=b,最后再把c=t  然后我们再进入下一个循环算4,如果我们求3这个格子的话,我们循环一次就达到了,我们求4这个格子,循环两次,求n这个格子,循环n-3+1次也就是两闭区间

#include <iostream>
using namespace std;
typedef long long LL;

int main()
{
	LL a,b,c;
	a = 1;b = 1;c = 2;
	LL n; cin >> n;
	for(LL i = 3;i<=n;i++)
	{
		LL t = a+b+c;
		a = b;
		b = c;
		c = t;
	}
	if(n==1) cout << 1 << endl;
	else
	cout << c << endl;


}

这是我们的代码

相关文章:

  • YOLOv8目标检测推理流程及C++代码
  • Android6到Android15版本新增的功能和api
  • Docker项目部署-部署前端
  • 深入解析JasperReports模板标签构建高效报表的利器系列一
  • 1985-2019年上市公司绿色专利申请量数据
  • 云服务培训四-网络服务
  • python---‘DataFrame‘ object has no attribute ‘read‘ 报错的解决
  • 牛客周赛83:A:JAVA
  • 面试题:说一下你对DDD的了解?
  • 常用的api测试软件
  • zookeeper-docker版
  • DeepSeek本地部署教程
  • gmock和cppfreemock原理学习
  • Python使用pyobdc库和tkinter框架连接数据库
  • oracle游标为什么没有共享,统计一下原因
  • 水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)
  • 《白帽子讲 Web 安全:点击劫持》
  • Makefile、Make和CMake:构建工具的三剑客
  • 授权与认证之jwt(一)创建Jwt工具类
  • macOS Sequoia 15.3 M3 Pro芯片 iOS 开发环境配置记录(最新)
  • 常州专业网站建设公司/什么是网络营销与直播电商
  • 人民政府门户网站首页/电工培训机构
  • 公司网站设计怎么做/宜兴网站建设
  • 网站工程师简历/谷歌app下载
  • 新手怎样做网站推广/网站关键词优化
  • 崇左网页设计/手机优化大师下载2022