• 动态规划-爬楼梯


    1.以爬楼梯问题为例,总结动态规划的步骤:

    第一步:定义dp数组(可能时一维数组,也可能是二维数组),这一步需要确定两个问题:

    (1)dp[i]或者dp[i][j]是什么含义(比如在爬楼梯问题中,dp[i]表示到达第i层有多少种爬法)

    (2)到底开多大的空间,你搞懂了第一个问题dp[i]或者dp[i][j]是什么含义,就知道到底要开多大的空间了,由于在爬楼梯问题中,dp[i]表示到达第i层有多少种爬法,你最后求的是到达第n层所需要的爬法数,所以最后要返回的是dp[n],所以显然要开n+1大小的数组,这样才能有dp[n](如果你只开n大小的数组,那么最后只能返回dp[n-1]

    第二步:初始化这个数组中的部分值

    dp[0]题目已经给了等于1

    dp[1]就是到达第一层有几种爬法,显然dp[1]=1

    第三步:/写出状态转移方程确定dp数组中其他位置元素的值

    爬楼梯问题:爬到第n层有可能是从第n-1层然后跨一层到达第n层的,也可能时从第n-2层然后跨两层到达第n层的

    青蛙跳台阶:力扣

    1. class Solution
    2. {
    3. public int numWays(int n)
    4. {
    5. if (n == 0) return 1;
    6. if (n == 1) return 1;
    7. //定义一个dp数组,dp[i]表示到达第i层有多少种爬法
    8. int[] dp = new int[n + 1];
    9. //初始化dp数组
    10. dp[0] = 1;
    11. dp[1] = 1;
    12. //写出状态转移方程确定数组中其他位置元素的值
    13. for (int i = 2; i <= n; i++)
    14. {
    15. dp[i] = (dp[i - 1] + dp[i - 2]) % 1000000007;
    16. }
    17. return dp[n];
    18. }
    19. }

    爬楼梯:力扣

    1. class Solution
    2. {
    3. public int climbStairs(int n)
    4. {
    5. if(n==1) return 1;
    6. if(n==2) return 2;
    7. ArrayList<Integer> result=new ArrayList();
    8. result.add(0);
    9. result.add(1);
    10. result.add(2);
    11. for(int i=3;i<=n;i++)
    12. {
    13. result.add(result.get(i-1)+result.get(i-2));
    14. }
    15. return result.get(n);
    16. }
    17. }

    2.连续子数组的最大和        力扣53

    比如数组为nums[]:1,-2,3,10,-4,7,2,-5

    以1结尾的所有子数组,以-2结尾的所有子数组,以3结尾的所有子数组.........以7结尾的所有子数组,以2结尾的所有子数组,以-5结尾的所有子数组

    开一个数组dp[nums.length],

    dp[i]表示以nums[i]结尾的所有子数组中最大和

    比如:dp[0]表示以nums[0](也就是1)结尾的所有子数组中最大和,显然dp[0]=1

    dp[1]表示以nums[1](也就是-2)结尾的所有子数组中最大和,显然dp[0]=1

    .......

    显然dp[i+1]=max(nums[i+1],dp[i]+nums[i+1])

    也就是说,dp[i+1]要么就是等于dp[i]加上nums[i+1],要么就是不要前面的子序列,只要nums[i+1]这个数

    1. class Solution
    2. {
    3. public int maxSubArray(int[] nums)
    4. {
    5. int[] dp=new int[nums.length];
    6. dp[0]=nums[0];
    7. for(int i=0;i<nums.length-1;i++)
    8. {
    9. dp[i+1]=Math.max(nums[i+1],dp[i]+nums[i+1]);
    10. }
    11. Arrays.sort(dp);
    12. return dp[nums.length-1];
    13. }
    14. }

  • 相关阅读:
    傅里叶变换的四种形式
    Thingsboard源码安装
    Apache Doris + Apache Hudi 快速搭建指南|Lakehouse 使用手册(一)
    linux驱动调试之Debugfs
    Docker搭建RabbitMQ集群_开启MQTT插件后连接不上
    华为云云服务器云耀L实例评测 | 从零到一:华为云云耀云服务器L实例上手体验
    【appium】App类型、页面元素|UiAutomator与appium|App元素定位
    Python学习记录 类相关
    大话Stable-Diffusion-Webui-客制化主题(一)
    Pytorch从零开始实战05
  • 原文地址:https://blog.csdn.net/weixin_47414034/article/details/125427020