首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >动态规划基础题(第1题): 被变换的菲波那切数列

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

作者头像
小码匠
发布2022-06-16 18:04:09
发布2022-06-16 18:04:09
21200
代码可运行
举报
运行总次数:0
代码可运行

碎碎念

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

标签

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

合集

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

题目地址

C - Typical Stairs

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

问题描述

Input

Input is given from Standard Input in the following format:

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
6 1
3

Sample Output 1

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
10 2
4
5

Sample Output 2

代码语言:javascript
代码运行次数:0
运行
复制
0

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

Sample Input 3

代码语言:javascript
代码运行次数:0
运行
复制
100 5
1
23
45
67
89

Sample Output 3

代码语言:javascript
代码运行次数:0
运行
复制
608200469

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

思路

  • 基于菲波那切数列改编的题目
  • 基于动态规划思路可以解题

题解

小码匠题解1

  • 这个题解:共有36个测试点,只有3个测试点没过,悲剧,暂时我还不知道哪里错了。
代码语言:javascript
代码运行次数:0
运行
复制
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了
代码语言:javascript
代码运行次数:0
运行
复制
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];
}

参考题解

代码语言:javascript
代码运行次数:0
运行
复制
#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]);
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码匠和老码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 碎碎念
  • 标签
  • 合集
  • 题目地址
  • 问题描述
    • Input
    • Output
    • Sample Input 1
    • Sample Output 1
    • Sample Input 2
    • Sample Output 2
    • Sample Input 3
    • Sample Output 3
  • 思路
  • 题解
    • 小码匠题解1
    • 小码匠题解2
    • 参考题解
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档