动态规划基础题(第1题):被变换的菲波那切数列

【动态规划专栏】--基础-- 动态规划经典题型 3道基础动态规划算法的一维线性dp经典题型。 阅读详情

碎碎念

  • 最近开始学习动态规划,相比之前学习的算法,诸如:枚举、贪心、全搜索等算法要复杂不少,这个山头不好攻。
  • “自己选的路,跪着也要走下去”,这话不是我说的,是老码农对我说的,上了贼船下船难啊。

标签

  • 动态规划、菲波那切数列

合集

  • 【动态规划】基本DP
  • 【数学】

题目地址

C - Typical Stairs

  • https://atcoder.jp/contests/abc129/tasks/abc129_c

问题描述

There is a staircase with N steps. Takahashi is now standing at the foot of the stairs, that is, on the 0-th step. He can climb up one or two steps at a time.

However, the treads of the a1_11​-th, a2_22​-th, a3_33​-th, …\ldots……, aM_MM​-th steps are broken, so it is dangerous to set foot on those steps.

How many are there to climb up to the top step, that is, the N-th step, without setting foot on the broken steps? Find the count modulo 1 000 000 007.

Constraints

  • 1≤N≤105
  • 0≤M≤N−1
  • 1 ≤\leq≤ a1_11​ < a2_22​ … < aM_MM​ ≤\leq≤ N-1

Input

Input is given from Standard Input in the following format:

N M
a1
a2
 .
 .
 .
aM

Output

Print the number of ways to climb up the stairs under the condition, modulo 1 000 000 007.


Sample Input 1

6 1
3

Sample Output 1

4

There are four ways to climb up the stairs, as follows:

  • 0→1→2→4→5→6
  • 0→1→2→4→6
  • 0→2→4→5→6
  • 0→2→4→6

Sample Input 2

10 2
4
5

Sample Output 2

0

There may be no way to climb up the stairs without setting foot on the broken steps.


Sample Input 3

100 5
1
23
45
67
89

Sample Output 3

608200469

Be sure to print the count modulo 1 000 000 007.

思路

  • 基于菲波那切数列改编的题目

  • 基于动态规划思路可以解题

题解

小码匠题解1

  • 这个题解:共有36个测试点,只有3个测试点没过,悲剧,暂时我还不知道哪里错了。
void coder_solution() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    const long long mod = 1000000007;
    int n, m;
    cin >> n >> m;
    vector<int> vi(m);
    vector<long long> dp(n + 1);
    long long ans = 0;
    dp[0] = 1;
    dp[1] = 1;
    for (int i = 0; i < m; i++) {
        cin >> vi[i];
        if (vi[i] == 1) {
            dp[1] = 0;
            ans++;
        }
    }

    for (int i = 2; i <= n; i++) {
        if (i == vi[ans]) {
            dp[i] = 0;
            ans++;
        } else {
            dp[i] = (dp[i - 1] + dp[i - 2]) % mod;
        }
    }
    cout << dp[n];
}

小码匠题解2

  • 这个是看了题解后又修改后的代码,AC了
void coder_solution() {
    // 提升cin、cout效率
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    const long long mod = 1000000007;
    int n, m, temp;
    cin >> n >> m;
    vector<bool> vb(n, false);
    vector<long long> dp(n + 1);
    dp[0] = 1;
    dp[1] = 1;
    for (int i = 0; i < m; i++) {
        cin >> temp;
        vb[temp - 1] = true;
        if(temp == 1) {
            dp[1] = 0;
        }
    }

    for (int i = 2; i <= n; i++) {
        if (!vb[i - 1]) {
            dp[i] = (dp[i - 1] + dp[i - 2]) % mod;
        }
    }
    cout << dp[n];
}

参考题解

#include<bits/stdc++.h>

using namespace std;
const int N = 1e5 + 7, mod = 1e9 + 7;
int n, m, a[N], f[N];

int main() {
    
    scanf("%d%d", &n, &m);
    for (int i = 1, x; i <= m; i++) {
        scanf("%d", &x), a[x] = 1;
    }
    
    f[0] = 1;
    for (int i = 1; i <= n; i++) {
        if (!a[i]) {
            f[i] = (f[i - 1] + f[i - 2]) % mod;
        }
    }
    printf("%d\n", f[n]);
}
C++动态规划入门习题+解析 此篇文章会利用一些简单的问题带你了解动态规划的知识。 阅读详情

相关推荐

第23期《atcoder AtCoder Beginner Contest 186 ABC三题 题解 》

Panasonic Programming Contest (AtCoder Beginner Contest 186) English XXX (Guest) Contest Duration:2020-12-19(Sat) 20:00-2020-12-19(Sat) 21:40(local time) (100 minutes)Back to Home Top Tasks Clarifications Submit Results Standings ...

joe_zxq21的博客 873

动态规划经典入门例题

简单来说,如果函数f(p1,p2,..,pn)是序列p1,p2,..,pn上的最优决策,那么将该序列任意拆分成p1,p2,..,pk和pk+1,pk+2,..,pn后,函数f(p1,p2,..,pk)与函数f(pk+1,pk+2,..,pn)也应当是这两个子序列上的最优决策。即W2=p(i)+W[i-1][j-v(i)]。如果k为1,即对i号项目投资1万元,此时的最大收益分为两部分,第一部分是在i号项目上的投资收益pi[1]万元,第二部分是剩余本金j-1万元所能获得的最大收益W[i-1][j-1]万元。

qq_50602534的博客 1026

经典的动态规划入门练习题

4.旅游预算 一个旅行社需要估算乘汽车从某城市到另一城市的最小费用,沿路有若干加油站,每个加油站收费不一定相同。旅游预算有如下规则: 若油箱的油过半,不停车加油,除非油箱中的油不可支持到下一站;每次加油时都加满;在一个加油站加油时,司机要花费2元买东西吃;司机不必为其他意外情况而准备额外的油;汽车开出时在起点加满油箱;计算精确到分(1元=100分)。编写程序估计实际行驶在某路线所需的最小费用。 输入格式: 从当前目录下的文本文件“route.dat”读入数据。按以下格式输入若干旅行路线的情况: 第一行为起点到终点的距离(实数) 第二行为三个实数,后跟一个整数,每两个数据间用一个空格隔开。其中第一个数为汽车油箱的容量(升),第二个数是每升汽油行驶的公里数,第三个数是在起点加满油箱的费用,第四个数是加油站的数量。(〈=50)。接下去的每行包括两个实数,每个数据之间用一个空格分隔,其中第一个数是该加油站离起点的距离,第二个数是该加油站每升汽油的价格(元/升)。加油站按它们与起点的距离升序排列。所有的输入都有一定有解。

动态规划经典入门题(初学必刷)

1.快饿死的xzzf 题目链接 题目描述 XzzF最近过着吃土的日子,饿的神魂颠倒!突然看到有人在做美食节宣传,有好多好吃的,但想吃到这些好吃的可以不容易!得答对主办方出的题。 现在XzzF拿到这样一道题:长度为N的01字符串,且满足以下条件的方案数有多少种? 1、串中不能有两个或多个连续的0。 例如,10、10101、11101是满足条件的,而00、10001、10010是不满足条件的。 Xzz...

jahup的博客 2647

告别抖动与滞后:深入博能传动伺服DSC功能,用105报文提升多轴同步性能

本文深入解析博能传动伺服DSC功能如何通过105报文实现多轴同步性能提升,有效解决工业自动化中的抖动与滞后问题。详细介绍了DSC技术原理、105报文实现机制及多轴同步工程实践,帮助工程师优化伺服系统性能,实现绝对齿轮同步。

weixin_30394981的博客 184

周志华《机器学习》课程系列笔记——目录导航页

最近自学机器学习课程,注意到了南京大学周志华老师的课程。我是在学堂在线平台观看的,注意到b站上也有相应视频,但b站上并未获得授权,随时有消失的可能。周志华老师的网络教学视频中,与其西瓜书相比确实少了一些内容。但幸运的是,缺失的内容实际上对于初学者来说并不会产生太大影响。目前这一笔记也遵循视频内容,相比西瓜书中也会有一些缺失,敬请谅解。可能以后如果有机会和时间,我会再阅读周志华老师的书籍将缺失内容补全。一切内容敬请关注我的个人Page页面。

Sinocifengs的博客 1687

力扣 —— 动态规划(基础题目)

【代码】随想录 —— 动态规划。

m0_73557953的博客 231

kaggle:Digit Recognizer《手写数字识别》你的第一个图像识别竞赛项目

新手,入门,巩固复习,深度学习,图像识别

qq_63591092的博客 3097

【动态规划】(一)动态规划理论及基础题目

整理总结动态规划理论基础及其通过基础习题熟悉动态规划五部曲的应用

weixin_46216674的博客 1766

RK3588实战:如何将8路1080P视频流实时拼接成一张超清全景图?聊聊AVS模块的那些事

本文深入解析了RK3588芯片的AVS模块如何实现8路1080P视频流的实时全景拼接技术。通过硬件加速、时间同步、几何校正和色彩均衡等关键技术,RK3588能够高效处理高密度视频流,输出超清全景图。文章还提供了优化策略和实战经验,帮助开发者充分发挥RK3588的潜力。

weixin_27014595的博客 738

UFS总体介绍及FPGA开发

通过实现UFS的主控制器、设备控制器等组件,我们可以在FPGA上进行UFS开发,并实现高速数据传输和低功耗特性的存储解决方案。物理层负责传输物理信号,数据链路层提供数据包的传输和错误检测功能,传输层处理数据包的分段、重组和重传,逻辑层管理设备和主控制器之间的命令和数据传输,文件系统层负责文件管理和数据存储。在本文中,我们将介绍UFS的总体架构和特性,并探讨如何在FPGA上进行UFS开发。这些组件的实现涉及到UFS协议的具体细节和硬件平台的特性,因此需要参考UFS协议规范和FPGA开发平台的相关文档。

PodProgram的博客 2135

算法分析与设计论文

1:递归算法 程序直接或间接调用自身的编程技巧称为递归算法(Recursion)。 递归算法是一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法。它通常把一个大型复杂的问题转化为一个与原问题类似的规模较小的问题来求解。 递归策略只需少量的代码就可描述出解题过程所需要的多次重复计算,大大减少了程序的代码量。递归的优势在于用有限的语句来定义对象的无限集合,用递归思想写出的程序往往十分简...

weixin_33912246的博客 1745

ICM20948 DMP代码详解(69)

ICM20948 DMP代码详解(69)

phmatthaus的专栏 616

(一)、动态规划的基本思想

拉肚肚 2100

国自然基金申请书撰写新思路:如何合理利用AI提高本子竞争力?

最后给大家推荐的400多所高校教师都在用的AI平台——高级学术版专业应用平台,集成了国际主流学术应用,以及ChatGPT、Claude、Gemini、Grok等Al大模型的高级版本平台,还有,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。创新点、技术路线、前期基础,但是我们也可以把写好的初稿交给AI,让它扮演资深研究员,帮我们精炼表述、优化段落结构,并揪出可能被评审追问的逻辑漏洞。,我们需要的是让它帮我们理清楚思路,而不是让它替我们完成内容。

智能AI让学术科研更容易 664

2026.3.9:具身智能之GraspNet:Ubuntu24.04安装GraspNet

本文详细介绍了在Ubuntu24.04系统下安装GraspNet具身智能框架的全过程。主要包括:1) 创建Python3.9虚拟环境;2) 安装CUDA12.8和PyTorch2.7.0等基础依赖;3) 编译安装pointnet2、knn和graspnetAPI三个核心组件;4) 修改源码适配新版PyTorch;5) 下载预训练权重并成功运行demo。安装过程中特别提示了可能遇到的报错处理方案,最终在GPU环境下实现了GraspNet的部署运行。整个流程涵盖了从环境配置到项目运行的完整步骤,为具身智能研究者

拥抱具身智能,昇腾Ascend C 203

<算法学习>动态规划练习题

动态规划练习题

caswind的博客 1222

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

动态规划入门详解 内含12道经典动态规划编程题

动态规划入门详解 一 什么是动态规划?? 算法导论中介绍,动态规划和分治方法类似,都是听过子问题的解来解决原问题。下面说一下这2者之间的分别,分治方法将原问题划分为互不相交的子问题,而后将子问题组合之后求出原问题的解,而动态规划是相反的,动态规划利用子问题之间的重叠,写出原问题和子问题之间的状态转移方程,转化为更小的子问题的求解,直到到达边界条件为止,有点类似于递归。 ①动态规划和分治的区别 分...

haocoming的博客 2512

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

G-500! ——动态规划基础题

G-500! ——动态规划基础题 描述: 简单的一个动规问题。只需要求出每个数的阶乘,然后输出就行。 考虑到数位很大,将其开成二维数组形式。 考虑到输入会是多组数据 所以要将1000以内的所有数字的阶乘都放在这个二维数组之中,以方便取出。 In these days you can more and more often happen to see programs which perfo...

rain_island的博客 204

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

2021-01-25广州大学ACM寒假训练赛解题心得

https://vjudge.net/contest/419545 目录A - Airplane AtCoder - abc129_aB - Balance AtCoder - abc129_bC - Typical Stairs AtCoder - abc129_cD - The Rank CodeForces - 1017AE - The Bits CodeForces - 1017BF - News Distribution CodeForces - 1167CG - Regular Bracket

涟漪Nodes 780

动态规划(练习题目)

故事开始以前 最初的那些春天 阳光洒在杨树上 风吹来 闪银光 街道平静而温暖 钟走得好慢 那是我还不识人生之味的年代 我情窦还不开 你的衬衣如雪 盼着杨树叶落下 眼睛不眨 心里像有一些话 我们先不讲 等待着那将要盛装出场的未来 人随风飘荡 天各自一方 在风尘中遗忘的清白脸庞 此生多勉强 此身越重洋 轻描时光漫长低唱语焉不详 数不清的流年 似是而非的脸 把你的故事对我讲 就让我笑出泪光 ...

mike_jun的博客 612

动态规划题目汇总(持续更新)

动态规划题目汇总(持续更新)

weixin_43954951的博客 5964

动态规划--基础例题解析

原题连接:腾讯后台笔试题

qq_34651592的博客 308

动态规划练习题

题目内容 Given exact k steps, how many ways to move a point from start point to destination? Point can move for eight directions(horizontally, vertically, diagonally, anti-diagonally). 答案 public class Te...

define_us的专栏 307

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 199
上一篇: 一道题两种解法:深度优先搜索、广度优先搜索-AtCode ABC204 C - Tour
下一篇: 动态规划基础题(第2题):累积和问题,华丽丽超时
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小码匠和老码农

喜欢作者

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值