zoukankan      html  css  js  c++  java
  • 图灵杯 爬楼梯

    题目描述

    由于第m个台阶上有好吃的薯条,所以薯片现在要爬一段m阶的楼梯.
    薯片每步最多能爬k个阶梯,但是每到了第i个台阶,薯片身上的糖果都会掉落ai个,现在问你薯片至少得掉多少糖果才能得到薯条?
    输入

    多组数据输入,每组数据第一行输入两个数字m(1<m<=1000),k(1<=k<m),接下来有m行,每一行输入ai(0<ai<=1000),表示第i个台阶会掉落的糖果.
    输出

    对于每组数据,输出至少要牺牲的糖果数.
    样例输入

    5 2
    1 2 3 4 5
    6 2
    6 5 4 3 2 1

    样例输出

    9

    9

    这个题就是个简单的动态规划,假设最多一次可以跨 k 层台阶,状态就是走到第i个台阶最少掉的糖果mc[ i ](i从1开始),状态转移方程就是mc[i]=min(mc[ i - j ])+a[i],状态转移方程中的 j 值是介于 1 和 k 之间的值。

    上代码:

     1 void main(){
     2         int m = 0;     //楼梯层数
     3         int k = 0;      //一次最多可以跨越的楼梯数
     4 
     5         //由于不是正儿八经做竞赛,所以写的比较随意
     6 
     7         cin>>m>>k;
     8         int *a = new int[m+1];   //每层台阶上要掉的糖果数,也就是所谓代价
     9         a[0] = 0;   //由于第一个值没用,所以直接赋值为0
    10         //输入每层的代价
    11         for(int i = 1;i<=m;++i)
    12              cin>>a[i];
    13         
    14         int *mc = new int[m+1];  //记录状态
    15     
    16         int tmp = 0;     //这个就瞎起名字了,说白了就是接收候选值
    17     
    18         mc[0] = 0;      //这一步关键,必须赋值为0
    19     
    20         for (int i = 1; i <= m; ++i){
    21             mc[i] = 10000;    
    22                 //这里不一定要赋值为10000,只是给一个不可能达到的最大值即可
    23           for (int j = 1; j <= k;++j)   //对每次怕多少层进行循环
    24             if (i >= j){
    25                 tmp = mc[i - j] + a[i];   //接收候选值,使用状态转移方程
    26                 mc[i] = mc[i] < tmp ? mc[i] : tmp;  //重复筛选候选值中最小值
    27             }
    28       }
    29       cout << mc[m] << endl;   //输出到达最高层的最小代价
    30 }
  • 相关阅读:
    MySQL视图和存储过程
    MySQL数据操作
    Pair RDD编程
    HDFS组成架构和读写数据流程
    RDD编程
    MySQL数据查询和函数
    数据库学习(二)
    玩爆你的手机联系人--T9搜索(一)
    POJ3259 Wormholes 【Bellmanford推断是否存在负回路】
    Java 小技巧和在Java避免NullPonintException的最佳方法(翻译)
  • 原文地址:https://www.cnblogs.com/messi2017/p/8024532.html
Copyright © 2011-2022 走看看