• 跳台阶(JAVA)


    跳台阶
      
      

      题目描述

      一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
      
      思路:典型的动态规划问题,动态规划问题最关键的是把事件中的各种情形抽象为状态,然后找到前后状态之间的关系,写出状态转化方程,再翻译为代码。
        可以考虑到题目中跳到第n层台阶有多少种跳法为一个状态,设置一个辅助数组dp[n+1],dp[i]代表跳到第i层台阶的跳法总数。
        因为一次只能跳1层或2层,那么dp[i]仅与dp[i-1]和dp[i-2]有关系。dp[i-1]可以通过跳一层得到dp[i],而dp[i-2]可以通过跳两层得到dp[i]。
        所以状态转化方程为:
            dp[i] = dp[i-1]+dp[i-2];
        
        最后考虑边界条件:dp[1]= 1,dp[2] = 2;
        
     1     public int JumpFloor(int target) {
     2         if(target<=2) return target;
     3         int[] dp = new int[target+1];
     4         dp[1] = 1;
     5         dp[2] = 2;
     6         for(int i=3;i<=target;i++){
     7             dp[i] = dp[i-1]+dp[i-2]*2;
     8         }
     9         return dp[target];
    10     }

        

     跳台阶2

      

      一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
      
      思路:此时条件变化为一次可以跳n步,则dp[i]与前面的状态都有关系。有了上面的基础,可以轻松写出状态转移方程为:
        
                  

      

     1     public int JumpFloorII(int target) {
     2         if(target<=2) return target;
     3         int[] dp = new int[target+1];
     4         dp[1] = 1;
     5         dp[2] = 2;
     6 
     7         for(int i=3;i<=target;i++){
     8             //因为可以一步跳到
     9             dp[i] = 1;
    10             for(int j=1;j<i;j++){
    11                 dp[i] += dp[j];
    12             }
    13         }
    14         return dp[target];
    15     }
  • 相关阅读:
    .NET Interop 工具集
    关于正弦波的算法
    Windows Phone 系列 本地数据存储
    Xaml cannot create an instance of “X”
    Windows Phone 系列 使用 MVVM绑定时无法获取当前值
    Windows Phone 系列 应用程序图标无法显示
    Windows Phone 系列 WPConnect无法上网的问题
    Windows Phone 系列 使用 Windows Phone 保存铃声任务
    WP7.5提交应用
    Windows Phone 系列 动态删除ObservableCollection
  • 原文地址:https://www.cnblogs.com/ztqup666/p/9237525.html
Copyright © 2020-2023  润新知