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

单调自增的数字 斐波那契数列 爬楼梯

1.给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。

(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)

#include <bits/stdc++.h>
using namespace std;
int find(int N)
{
    string str=to_string(N);
    int flag=str.size();
    for(int i=str.size()-1;i>0;i--)
    {
        if(str[i]<str[i-1])
        {
            flag=i;
            str[i-1]--;
        }
     } 
     for(int i=flag;i<str.size();i++)
     {
         str[i]='9';
     }
     return stoi(str);
 } 
 int main()
 {
    int N=332;
    int t=find(N);
    cout<<t;
   return 0;
 }

思路:

题目要求小于等于N的最大单调递增的整数,那么拿一个两位的数字来举例。

例如:98,一旦出现strNum[i - 1] > strNum[i]的情况(非单调递增),首先想让strNum[i - 1]--,然后strNum[i]给为9,这样这个整数就是89,即小于98的最大的单调递增整数。

这一点如果想清楚了,这道题就好办了。

此时是从前向后遍历还是从后向前遍历呢?

从前向后遍历的话,遇到strNum[i - 1] > strNum[i]的情况,让strNum[i - 1]减一,但此时如果strNum[i - 1]减一了,可能又小于strNum[i - 2]。

这么说有点抽象,举个例子,数字:332,从前向后遍历的话,那么就把变成了329,此时2又小于了第一位的3了,真正的结果应该是299。

那么从后向前遍历,就可以重复利用上次比较得出的结果了,从后向前遍历332的数值变化为:332 -> 329 -> 299

确定了遍历顺序之后,那么此时局部最优就可以推出全局。

2.斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你n ,请计算 F(n) 。

#include <bits/stdc++.h>
using namespace std;
int fib(int N)
{
    if(N<=1)
        return N;
    vector<int> dp(N+1);
    dp[0]=0;
    dp[1]=1;
    for(int i=2;i<=N;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[N];
}
int main()
{
    int t=fib(7);
    cout<<t;
    return 0;
}

 思路:

动规五部曲:

这里我们要用一个一维dp数组来保存递归的结果

1.确定dp数组以及下标的含义

dp[i]的定义为:第i个数的斐波那契数值是dp[i]

2.确定递推公式

为什么这是一道非常简单的入门题目呢?

因为题目已经把递推公式直接给我们了:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

3.dp数组如何初始化

即dp[0]=0  dp[1]=1

4.确定遍历顺序

从递归公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,dp[i]是依赖 dp[i - 1] 和 dp[i - 2],那么遍历的顺序一定是从前到后遍历的

5.举例推导dp数组

按照这个递推公式dp[i] = dp[i - 1] + dp[i - 2],我们来推导一下,当N为10的时候,dp数组应该是如下的数列:

0 1 1 2 3 5 8 13 21 34 55

如果代码写出来,发现结果不对,就把dp数组打印出来看看和我们推导的数列是不是一致的。

2.假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

#include <bits/stdc++.h>
using namespace std;
int climbstair(int n)
{
    if(n<=1)
    return n;
    vector<int> dp(n+1);
    dp[1]=1;
    dp[2]=2;
    for(int i=3;i<=n;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}
int main()
{
    int t=climbstair(6);
    cout<<t;
    return 0;
}
 

思路:

爬到第一层楼梯有一种方法,爬到二层楼梯有两种方法。

那么第一层楼梯再跨两步就到第三层 ,第二层楼梯再跨一步就到第三层。

所以到第三层楼梯的状态可以由第二层楼梯 和 到第一层楼梯状态推导出来,那么就可以想到动态规划了。

我们来分析一下,动规五部曲:

定义一个一维数组来记录不同楼层的状态

1.确定dp数组以及下标的含义

dp[i]: 爬到第i层楼梯,有dp[i]种方法

2.确定递推公式

如何可以推出dp[i]呢?

从dp[i]的定义可以看出,dp[i] 可以有两个方向推出来。

首先是dp[i - 1],上i-1层楼梯,有dp[i - 1]种方法,那么再一步跳一个台阶不就是dp[i]了么。

还有就是dp[i - 2],上i-2层楼梯,有dp[i - 2]种方法,那么再一步跳两个台阶不就是dp[i]了么。

那么dp[i]就是 dp[i - 1]与dp[i - 2]之和!

所以dp[i] = dp[i - 1] + dp[i - 2] 。

在推导dp[i]的时候,一定要时刻想着dp[i]的定义,否则容易跑偏。

这体现出确定dp数组以及下标的含义的重要性!

3.dp数组如何初始化

再回顾一下dp[i]的定义:爬到第i层楼梯,有dp[i]种方法。

那么i为0,dp[i]应该是多少呢,这个可以有很多解释,但基本都是直接奔着答案去解释的。

例如强行安慰自己爬到第0层,也有一种方法,什么都不做也就是一种方法即:dp[0] = 1,相当于直接站在楼顶。

但总有点牵强的成分。

那还这么理解呢:我就认为跑到第0层,方法就是0啊,一步只能走一个台阶或者两个台阶,然而楼层是0,直接站楼顶上了,就是不用方法,dp[0]就应该是0.

其实这么争论下去没有意义,大部分解释说dp[0]应该为1的理由其实是因为dp[0]=1的话在递推的过程中i从2开始遍历本题就能过,然后就往结果上靠去解释dp[0] = 1

从dp数组定义的角度上来说,dp[0] = 0 也能说得通。

需要注意的是:题目中说了n是一个正整数,题目根本就没说n有为0的情况。

所以本题其实就不应该讨论dp[0]的初始化!

我相信dp[1] = 1,dp[2] = 2,这个初始化大家应该都没有争议的。

所以我的原则是:不考虑dp[0]如何初始化,只初始化dp[1] = 1,dp[2] = 2,然后从i = 3开始递推,这样才符合dp[i]的定义。

4.确定遍历顺序

从递推公式dp[i] = dp[i - 1] + dp[i - 2];中可以看出,遍历顺序一定是从前向后遍历的

5.举例推导dp数组

举例当n为5的时候,dp table(dp数组)应该是这样的。

这题和斐波那契数列非常相似,唯一的区别是,没有讨论dp[0]应该是什么,因为dp[0]在本题没有意义!

相关文章:

  • UML中的用例图和类图
  • npm webpack打包缓存 导致css引用地址未更新
  • C++ 结构体与函数
  • Java基础知识总结(1.8)——Java 注解(持续更新)
  • CSS 父类元素的伪类 选择器
  • FME 中使用 DeepSeek API 与 天地图API
  • 使用perf工具分析Linux系统的性能瓶颈
  • 如何轻松查看安卓手机内存,让手机更流畅
  • (转)子网掩码的作用(1)
  • 期刊 | 不收版面费与审稿费的电子通信类期刊
  • R语言操作练习
  • windows服务器切换到linux服务器踩坑点
  • 树莓派超全系列文档--(17)树莓派配置显示器
  • 蓝桥杯 python 研究生组 备战刷题
  • PhotoShop学习03
  • Android 中获取颜色资源
  • Buzz1.2.0视频语音转成TXT、SRT、VTT工具
  • Python数据可视化-第4章-图表样式的美化
  • SQL INSERT INTO 语句详解
  • Linux编译安装mysql5.7.44 笔记250330
  • 网站编程零基础入门/2023推广平台
  • 推广一次多少钱/徐州seo外包
  • 深圳市社会保险网站/武汉seo认可搜点网络
  • 视频网站的链接怎么做/长春网络优化最好的公司
  • 党务公开网站建设汇报/百度导航是哪个国家的
  • 邢台网站建设报价/线上推广策划方案