zoukankan      html  css  js  c++  java
  • 洛谷P1244 青蛙过河

    P1244 青蛙过河

      • 362通过
      • 525提交
    • 题目提供者该用户不存在
    • 标签
    • 难度普及-
    • 时空限制1s / 128MB

      讨论  题解  

    最新讨论更多讨论

    题目描述

    有一条河,左边一个石墩(A区)上有编号为1,2,3,4,…,n的n只青蛙,河中有k个荷叶(C区),还有h个石墩(D区),右边有一个石墩(B区),如下图所示。n只青蛙要过河(从左岸石墩A到右岸石墩B),规则为:

    (1)石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);

    (2)青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;

    (3)当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大1号的青蛙上面。

    你的任务是对于给出的h,k,计算并输出最多能有多少只青蛙可以根据以上规则顺利过河?

    输入输出格式

    输入格式:

    两个整数h,k

    输出格式:

    一个整数,表示最多能有多少只青蛙可以根据以上规则顺利过河。

    输入输出样例

    输入样例#1:
    2 3
    
    输出样例#1:
    16
    分析:这道题很显然是一道递推的题,和汉诺塔问题差不多,影响答案的是荷叶的数量和石墩的数量,那么我们设f[i][j]表示有i个石墩,j个荷叶,最多能跳过去多少只青蛙.先从小的情况来考虑,f[0][j] = j + 1,很显然,先让一只青蛙跳到石墩上,然后其它青蛙跳到荷叶上,最后统一跳到石墩上.那么f[1][j]呢?有了另外一个石墩,我们可以先让尽量多的小号青蛙跳到D上,再让尽量多的大号青蛙跳到B上,最后让D上的青蛙跳到B上,这样我们可以先把B当作不存在,那么就是前一种情况f[0][j],然后把D当作不存在,还是前一种情况f[0][j],那么f[1][j]就是2*f[0][j].
    再来分析一下f[2][j],跳到B上的和跳到一号石墩的青蛙数是2*f[0][j],跳到二号石墩的青蛙数就是f[1][j]了,因为我们只考虑二号石墩,忽略一号石墩,把二号石墩当作了终点,那么相当于只有一号石墩的这种情况,其他石墩就不能当作终点了。可以得到f[i][j] = sum{f[k][j]} + f[0][k](0 <= k < j),f[0][j]告诉了,那么我们可以化简这个式子,f[1][j] = 2*f[0][j],f[2][j] = 4*f[0][j],f[3][j] = 8*f[0][j],那么最终答案就是(k+1)*2^h.
    比较值得回味的几个地方:1.定义状态看哪些量对答案有影响,最直接的就是把输入定义为状态.2.先分析小情况,一步一步推向一般情况.
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    
    using namespace std;
    
    int h,k;
    
    int main()
    {
        scanf("%d%d",&h,&k);
        printf("%d
    ",(k + 1) * (1 << h));
        
        return 0;
    }


  • 相关阅读:
    jquery 菜单1
    Notepad++在vs2008下编译运行
    Linux readelf命令的使用
    Linux下truss、strace或ltrace的使用
    (转载)new和malloc的区别
    windows xp 设置回环网卡
    Linux下没有网线的情况下,从主机使用SSH登录虚拟机
    Linux ELF文件学习(1)
    C++子类继承父类
    (转载)wireshark抓包的时候有黄条、蓝条各代表什么意思?
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7478554.html
Copyright © 2011-2022 走看看