• 算法修炼-动态规划之斐波那契数列模型


    一、动态规划的算法原理

            这是本人动态规划的第一篇文章,所以先阐述一下动态规划的算法原理以及做题步骤。动态规划本人的理解就是通过题目所给的条件正确地填满dp表(一段数组)。首先要先确定好dp表每个位置的值所代表的含义是什么,然后通过题目条件以及经验推出状态转移方程,第三个就是初始化,确定填表顺序以及保证填表不越界,最后输出题目所需的结果,大致就是这个思路。

    二、斐波那契数列模型例题分析

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

    本题的思路较为简单,状态转移方程已经给出,直接上代码:

    1. class Solution {
    2. public:
    3. int tribonacci(int n)
    4. {
    5. vector<int> v1(n+1);
    6. //初始化
    7. if(n == 1)
    8. return 1;
    9. else if(n == 2)
    10. return 1;
    11. else if(n == 0)
    12. return 0;
    13. v1[0] = 0;
    14. v1[1] = 1;
    15. v1[2] = 1;
    16. for(int i = 3; i <= n; i++)
    17. {
    18. v1[i] = v1[i-1] + v1[i-2] + v1[i-3];
    19. }
    20. return v1[n];
    21. }
    22. };

    面试题 08.01. 三步问题 - 力扣(LeetCode)

    解析: 

            假设小孩此时正处于某一台阶上,那他是如何到达这一台阶的呢?是不是他有可能是从该台阶的前一个台阶跳上来的,也可能是从该台阶的前两个台阶跳上来的,也可能是从该台阶的前三个台阶跳上来的,所以小孩到某一台阶就有三种可能情况,也即dp表中某个位置的值就是这个位置前三个位置的值相加,从而确定出了状态转移方程。

    1. class Solution {
    2. public:
    3. int waysToStep(int n)
    4. {
    5. //创建dp表
    6. vector<int> v1(n+1);
    7. if(n ==1)
    8. return 1;
    9. if(n == 2)
    10. return 2;
    11. if(n == 3)
    12. return 4;
    13. //初始化
    14. v1[1] = 1;v1[2] = 2; v1[3] = 4;
    15. for(int i = 4; i <= n; i++)
    16. {
    17. //确定状态转移方程,这里需要注意,加数的和可能会越界,根据题目要求要对1000000007取模
    18. v1[i] = ((v1[i-1] + v1[i-2]) % 1000000007 + v1[i-3])%1000000007;
    19. }
    20. return v1[n];
    21. }
    22. };

     746. 使用最小花费爬楼梯 - 力扣(LeetCode)

    解析: 

            要确定每一级楼梯最低花费,通过比较前两级楼梯,确定应该加的值,从而确定状态转移方程。

    1. class Solution {
    2. public:
    3. int minCostClimbingStairs(vector<int>& cost)
    4. {
    5. int length = cost.size();
    6. //dp表
    7. vector<int> MinCost(length);
    8. //初始化
    9. for(int i = 0; isize(); i++)
    10. {
    11. MinCost[i] = cost[i];
    12. }
    13. //状态转移方程
    14. for(int i = 2; i
    15. {
    16. if(MinCost[i-1] < MinCost[i-2])
    17. {
    18. MinCost[i] += MinCost[i-1];
    19. }
    20. else
    21. {
    22. MinCost[i] += MinCost[i-2];
    23. }
    24. }
    25. if(MinCost[cost.size() - 1] < MinCost[cost.size() - 2])
    26. {
    27. return MinCost[cost.size() - 1];
    28. }
    29. else
    30. {
    31. return MinCost[cost.size() - 2];
    32. }
    33. }
    34. };

     91. 解码方法 - 力扣(LeetCode)

    解析: 

            选定一个位置作为结尾,如果这个位置的值不为零,就看其能否与前一个位置的值组成合法编码,如果能,这个位置的值就是它的前一个位置加上它的前前一个位置的值,如果不能,这个位置的值就是它的前一个位置的值;如果这个位置的值为零,就看其能否与前一个位置的值组成合法编码,如果能,这个位置的值就是它的前前一个位置的值。

    1. class Solution {
    2. public:
    3. int numDecodings(string s)
    4. {
    5. int len = s.length();
    6. int arr[len];
    7. const char* str;
    8. str = s.c_str();
    9. for(int i = 0; i
    10. {
    11. arr[i] = str[i] - 48;
    12. }
    13. //处理特殊情况
    14. if(arr[0] == 0)
    15. {
    16. return 0;
    17. }
    18. else if(len == 1 && arr[0] != 0)
    19. {
    20. return 1;
    21. }
    22. for(int i = 1; i
    23. {
    24. //例:30
    25. if(arr[i] == 0 && (arr[i-1] >2))
    26. {
    27. return 0;
    28. }
    29. //例:1001
    30. else if(i+1 < len && arr[i] == 0 && arr[i+1] == 0)
    31. {
    32. return 0;
    33. }
    34. }
    35. for(int i = 0; i
    36. {
    37. cout << arr[i] << " ";
    38. }
    39. //dp表
    40. vector<int> vect(len+1);
    41. //初始化
    42. vect[0] = 1;vect[1] = 1;
    43. //状态转移方程
    44. for(int i = 2; i < vect.size(); i++)
    45. {
    46. if(arr[i-1] != 0)
    47. {
    48. if(arr[i-2] != 0 && ((arr[i-1] + arr[i-2]*10) <= 26))
    49. {
    50. vect[i] = vect[i-1] + vect[i-2];
    51. }
    52. else
    53. {
    54. vect[i] = vect[i-1];
    55. }
    56. }
    57. else
    58. {
    59. vect[i] = vect[i-2];
    60. }
    61. }
    62. return vect[len];
    63. }
    64. };

  • 相关阅读:
    【限时福利】21天学习挑战赛 - MySQL从入门到精通
    原生js html5 canvas制作flappy bird压扁小鸟游戏
    实用新型专利的注意事项
    8月算法训练------第九天(搜索与回溯)解题报告
    Ceph入门到精通-设置和取消设置 Ceph 覆盖选项
    亚洲国家列表 Asia country list
    PMP每日一练 | 考试不迷路-11.11(包含敏捷+多选)
    C++11(lambda表达式)
    JavaScript(JS)的简单了解
    word导出或另存为pdf图片不清晰问题解决方案
  • 原文地址:https://blog.csdn.net/m0_74265792/article/details/136381270