• DP28 跳跃游戏(三)


    题解:1.先判断是否可以到达最后一个值,如果不能到达直接返回-1;

    2.如果可以到达最后一个位置,用dp求到达最后一个位置所需的最小次数,dp[i]表示到达第i个位置所需的最小次数,具体dp详情,见代码。

    描述

    给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度。请你判断最少跳几次能跳到数组最后一个位置。

    1.如果跳不到数组最后一个位置或者无法跳跃(即数组长度为0),请返回-1

    2.数据保证返回的结果不会超过整形范围,即不会超过2^{31}-1231−1

    数据范围:

    0<=nums.length<=10^50<=nums.length<=105

    0<=nums[i]<=10000<=nums[i]<=1000

    输入描述:

    第一行输入一个正整数 n 表示数组 nums的长度

    第二行输入 n 个整数,表示数组 nums 的内容

    输出描述:

    输出最少跳几次到最后一个位置

    示例1

    输入:

    7
    2 1 3 3 0 0 100

    复制输出:

    3

    复制说明:

     
    

    首先位于nums[0]=2,然后可以跳2步,到nums[2]=3的位置,step=1

     再跳到nums[3]=3的位置,step=2

    再直接跳到nums[6]=100,可以跳到最后,step=3,返回3

    示例2

    输入:

    7
    2 1 3 2 0 0 100

    复制输出:

    -1
    1. #include<stdio.h>
    2. #include<algorithm>
    3. #include<string.h>
    4. using namespace std;
    5. int num[100005];
    6. int dp[101005];
    7. int main()
    8. {
    9. int n;
    10. scanf("%d",&n);
    11. memset(dp,-1,sizeof(dp));
    12. if(n==0)
    13. {
    14. printf("-1\n");
    15. return 0;
    16. }
    17. for(int i=1;i<=n;i++)
    18. {
    19. scanf("%d",&num[i]);
    20. }
    21. int idx=0;
    22. idx=num[1]+1;
    23. int t=0;
    24. for(int i=2;i<=n;i++)
    25. {
    26. if(idx>=i)
    27. {
    28. int m=i+num[i];
    29. if(m>idx)
    30. {
    31. idx=m;
    32. }
    33. }
    34. else{
    35. t=1;
    36. break;
    37. }
    38. }
    39. if(t || idx<n)
    40. {
    41. printf("-1\n");
    42. }
    43. else{
    44. int id=0;
    45. for(int i=1;i<=n;i++)
    46. {
    47. if(i==1)
    48. {
    49. id=i+num[i];
    50. dp[i]=0;
    51. }
    52. else{
    53. if(id>=i)
    54. {
    55. int m=i+num[i];
    56. if(m>id)
    57. {
    58. id=m;
    59. }
    60. }
    61. }
    62. for(int j=1;j<=num[i];j++)
    63. {
    64. if(dp[i+j]!=-1)
    65. {
    66. dp[i+j]=min(dp[i+j],dp[i]+1);
    67. }
    68. else{
    69. dp[i+j]=dp[i]+1;
    70. }
    71. }
    72. }
    73. printf("%d\n",dp[n]);
    74. }
    75. return 0;
    76. }

  • 相关阅读:
    20.单例模式进阶
    支持向量机
    【黑马-SpringCloud技术栈】【07】Gateway
    Seata AT模式源码解析一(Seata Server端启动流程)
    视觉答题的方法、数据集和评价指标综述
    Debian 使用 systemd 自动挂载 Samba
    MySQL主从复制+读写分离
    多测师肖sir_高级金牌讲师___python之configparser模块
    详解Object类和抽象类
    【Flutter】Flutter 数据存储 shared_preferences 简介
  • 原文地址:https://blog.csdn.net/qq_42434171/article/details/126787584