A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

问题:一共有N个台阶,可以按2的幂次方(1,2,4,8...)来跳,总共有多少种中法

分析:f(0) = 1

第1个台阶,有 f(1-1)种跳法

第2个台阶,有 f(2-1)+f(2-2)种跳法

第3个台阶,有 f(3-1)+f(3-2)种跳法

第4个台阶,有 f(4-1)+f(4-2)+f(4-4)种跳法

第5个台阶,有 f(5-1)+f(5-2)+f(5-4)种跳法

第6个台阶,有 f(6-1)+f(6-2)+f(6-4)种跳法

第7个台阶,有 f(7-1)+f(7-2)+f(7-4)种跳法

第8个台阶,有 f(8-1)+f(8-2)+f(8-4)+f(8-8)种跳法

第9个台阶,有 f(9-1)+f(9-2)+f(9-4)+f(9-8)种跳法

第10个台阶,有 f(10-1)+f(10-2)+f(10-4)+f(10-8)种跳法

.....

推理可得f(n) = f(n-1)+f(n-2*1)+f(n-2*2)+f(n-2*3)+....+f(n-2*MAX),其中是2的MAX次方不超过n时的指数,如n=8时,MAX为3。

故该题可用动态规划来做,保存已经算过的数据,来求新的数。

public class Test {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                int n = 16;
                int[] dp = new int[n+1];
                dp[0] = 1;
                for(int i=1; i<=n; i++){
                        int idx = fun1(i);
                       
                        //f(n) = f(n-1)+f(n-2*1)+f(n-2*2)+f(n-2*3)+....+f(n-2*MAX)
                        for(int j=0; j<=idx; j++){
                                dp += dp[(int)(i-Math.pow(2, j))];
                        }
                }
                System.out.println(dp[8]);

        }
       
        //求出2的x次方不超过n时的,最大指数(x)
        public static int fun1(int n){
                int idx = 0;
                for(int i=0; i<Integer.MAX_VALUE; i++){
                        if(Math.pow(2, i)>n){
                                idx = i-1;
                                break;
                        }else if(Math.pow(2, i) == n){
                                idx = i;
                                break;
                        }
                }
                return idx;
        }
}

---------------------
作者:另一个我竟然存在
来源:CSDN
原文:https://blog.csdn.net/qq_24034545/article/details/82620735
版权声明:本文为博主原创文章,转载请附上博文链接!

1 个回复

正序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马