zoukankan      html  css  js  c++  java
  • 每日一练之动态算法

    洛谷P1192 台阶问题 //maxon.blog.luogu.org

    N级的台阶,你一开始在底部,每次可以向上迈最多K级台阶(最少1级),问到达第N级台阶有多少种不同方式。

            对于此类动态规划问题,可以联想斐波那契数列,如果迈上终点台阶时,可以在原先的第N-1级至第N-K级(共K级)基础上再多迈一次,也就是说F(N)=F(N-1)+F(N-2)+...+F(N-K)。那为什么不在加1呢?因为将所有方案加到一起就是一次可能性的整合,即到了F(N-1)~F(N-K) 这个区间内就是等同于到F(N)了。但是它们都可以通过这种递推方式计算。比如在10阶时可以迈三步,那么迈一步或者三步就是一次选择,到达第8阶或第9阶之前是怎么选择就不用考虑。

          F(N-1)~F(N-K)可以用一层循环来表示,截止当前的阶梯数i,每次可走的阶梯数j(1~K之间),并且不能超过;则有如下代码:

     1 #include<iostream>
     2 using namespace std;
     3 //N阶梯K步时的和为(N-K)到N阶梯K步的和。
     4 const int MAX = 100010;         //台阶不超过10000级
     5 int steps[MAX];
     6 
     7 int main()
     8 {
     9     int total,step,i,j;            
    10     cin>>total>>step;                          //输入台阶数和可跨的步数
    11     for(i=1;i<=step;i++) steps[i] = 1;       //给初值
    12 
    13     for(i=2;i<=total;i++)
    14     {
    15         for(j=1;j<=step&&j<=i;j++)
    16         {
    17             steps[i] = (steps[i]+steps[i-j])%(1e+9);    //取模以免溢出
    18         }
    19 
    20 /*
    21         也可采用此方式
    22       for(j=i-1;j>i-step&&j>0;j--)
    23         {
    24             steps[i] = (steps[i]+steps[j])%(1e+9);    //取模以免溢出
    25         }
    26     
    27 */
    28     }
    29     cout<<steps[total]<<endl;
    30     return 0;
    31 }

    同时转载大佬总结http://cppblog.com/menjitianya/archive/2015/10/23/212084.html

  • 相关阅读:
    JS弹出下载对话框以及实现常见文件类型的下载
    什么是物理像素、虚拟像素、逻辑像素、设备像素,什么又是 PPI, DPI, DPR 和 DIP
    学会git玩转github,结尾有惊喜!有惊喜!有惊喜!
    Menu实现逻辑
    控件保持多种绘图状态的做法
    2个函数宏技巧
    绘图 Painter转接口封装的方式
    DirectUI消息循环的简单封装
    c++以代理的方式来实现接口化编程
    c++对象工厂
  • 原文地址:https://www.cnblogs.com/maxonzou/p/10578978.html
Copyright © 2011-2022 走看看