标签:上楼 int 复用 问题 算法 result 楼梯 三步
描述:
三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。
个人思路:
暴力破解,多层循环,每步阶梯相加值等于最终值时上楼方式+1
大神思路:
三步问题前三级楼梯,上楼方式固定为1,2,4种,从第四步开始,可用方程式代替,每增加一级楼梯,结果 = 前三级之和。
// n为楼梯数 public int upstair(int n) { int[] result = new int[n +1]; // 要初始化数组从1开始算 if (n > 1) result[1] = 1; if (n > 2) result[2] = 2; if (n > 3) result[3] = 4; // 前三步上楼方式时特殊情况固定的,若不加判断,n< 3则会数组越界
// 从4开始,是因为4以后才能用到以下循环计算上楼方式 每增加一级,为[n - 1] + [n - 2] + [n - 3]之和。 for(int i = 4; i <= n; ++i) { result[i] = ((result[i - 3] + result[i - 2])%1000000007 + result[i - 1])%1000000007 // 2次模1000000007 防止int溢出
}
return result[i];
}
动态规划
1、创建初始条件
2、创建基础方程式,基础方程式创建较难,要知道问题的临界点,创建可复用方程。
3、缓存并复用第二步结果
4、从小到大执行,类似递归,但递归容易内存溢出,并且执行时间为log(2^n)。而缓存并复用,则把执行时间降低为log(n)。用空间换时间。
标签:上楼,int,复用,问题,算法,result,楼梯,三步 来源: https://www.cnblogs.com/lzylcf/p/14613434.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。