• DP27 跳跃游戏(二)


    题解:首先确定可不可以到达最后一个位置:

    1、如果不可以直接返回结果-1;

    2、如果可以用dp求到达最后一个位置的最大积分:dp[i]表示到达位置i的最大积分;

    //id表示可以到达的最大位置坐标,i表示当前位置

    if(id>=i)

    {

    dp[i]=dp[i]+num[i];

    if(num[i]+i>id)

         id=num[i]+i;

    }

      for(int j=1;j<=num[i];j++)
       {
                   
    dp[i+j]=max(dp[i],dp[i+j]);//表示dp[i+j]表示i+j到达位置的最大积分
         }

    详情请看代码

    描述

    给定一个非负整数数组nums,假定最开始处于下标为0的位置,数组里面的每个元素代表下一跳能够跳跃的最大长度,如果可以跳到数组最后一个位置,请你求出跳跃路径中所能获得的最多的积分。

    1.如果能够跳到数组最后一个位置,才能计算所获得的积分,否则积分值为-1

    2.如果无法跳跃(即数组长度为0),也请返回-1

    3.数据保证返回的结果不会超过整形范围,即不会超过

    输入描述:

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

    第二行输入 n 个整数,表示数组 nums 的所有元素的值

    输出描述:

    输出能获得的最多的积分

    示例1

    输入:

    6
    2 4 2 1 0 100

    复制输出:

    106

    复制说明:

    首先位于nums[0]=2,然后可以跳1步,到nums[1]=4的位置,积分=2+4=6,再跳到nums[5]=100的位置,积分=6+100=106
    这样保证既能跳到数组最后一个元素,又能保证获取的积分最多    
     

    示例2

    输入:

    6
    2 4 0 2 0 100

    复制输出:

    108

    复制说明:

    跳跃路径为:2=>4=>2=>100,总共为108        

    示例3

    输入:

    6
    2 3 2 1 0 100

    复制输出:

    -1

    复制说明:

    跳不到最后一个位置,返回-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 step=0;
    22. //dp[i]走到第i位置获得的最大积分
    23. dp[1]=num[1];
    24. step=num[1]+1;
    25. int t=0;
    26. for(int i=2;i<=n;i++)
    27. {
    28. if(step>=i)
    29. {
    30. if(i+num[i]>=step || i+num[i]>=n)
    31. {
    32. step=i+num[i];
    33. }
    34. }
    35. else{
    36. t=1;
    37. break;
    38. }
    39. }
    40. //不能到达最后一个位置
    41. if(t || step<n)
    42. {
    43. printf("-1\n");
    44. return 0;
    45. }
    46. else{//可以到达最后一个位置,用dp求最大积分
    47. int id=0;
    48. for(int i=1;i<=n;i++)
    49. {
    50. if(i==1)
    51. {
    52. dp[i]=num[i];
    53. id=num[i]+1;
    54. }
    55. else{
    56. if(id>=i)
    57. {
    58. dp[i]=dp[i]+num[i];
    59. int m=i+num[i];
    60. if(m>id)
    61. {
    62. id=m;
    63. }
    64. }
    65. }
    66. for(int j=1;j<=num[i];j++)
    67. {
    68. dp[i+j]=max(dp[i],dp[i+j]);
    69. }
    70. }
    71. printf("%d\n",dp[n]);
    72. }
    73. return 0;
    74. }

  • 相关阅读:
    ET-G2-D24-4A-A、ET-G2-D24-2A-V两路独立设置比例控制器
    delete删除后怎么恢复文件?四种方法进行找回
    JAVA 反射学习
    Linux内核有什么之内存管理子系统有什么第三回 —— 小内存分配(1)
    Rocky/GNU之Zabbix部署(1)
    Spring 中自定义注解 @DBMasterAnno 和 @Async 注解在循环依赖场景下使用出现问题
    docker试验步骤与截图(无用)
    五步走,轻松拥有你的个性化小程序
    Azure Machine Learning - 什么是 Azure AI 搜索?
    HDMI简介
  • 原文地址:https://blog.csdn.net/qq_42434171/article/details/126785887