洛谷P1244 青蛙过河 DP/思路

又是一道奇奇怪怪的DP(其实是思路题).

原文戳>>https://www.luogu.org/problem/show?pid=1244<<

这题的意思给的挺模糊,需要一定的人生经验理解能力.

题目想必已知,我就提几点可能会搞错的点吧.

1.题目说了青蛙可以:A→B(表示可以从A跳到B,下同),A→C,A→D,C→B,D→B,D→C,C→D;但却不能跳到A,B上再跳回来.所以不可以脑补成汉内塔那种跳法.

2.青蛙只能跳到比它大1号的青蛙上面,而不是比他大的青蛙就行.所以不可以脑补成汉内塔.

3.可以把一套操作看成一个单位元.我对一套操作的定义如下:

当k确定而h=0时,没有中间柱子,蛤蛤们只能通过荷叶来移动.每片荷叶只能有1位青蛙.所以要求最大的通过数目就必须把所有的荷叶用上.西方哪一片荷叶我.....

由于他们必须按顺序从小到大从上到下垒起来.所以这种情况下,最大通过数目为k+1.

      如k=4时 

         1                              

         2

         3

         4

         5 

         A          _  _  _  _          B

 

         从上到下跳到荷叶上:

 

         5          1  2  3  4                    

         A          _  _  _  _          B

         最后一位直接到B

                     1  2  3  4          5         

         A          _  _  _  _          B

         然后只能4先跳到B上

                                            4

                     1  2  3             5         

         A          _  _  _  _         B

直至完成全部操作.这个过程就是通过两个柱子和k片荷叶完成的一个单位操作 .之后为了简化问题,我们以单位操作为最小单位讨论问题.

 

我们把单位元编号,若荷叶有k片,则一个单位最多移动k+1只青蛙.我们令第1到k+1只为整体D1,而k+2到2k+2为D2,以此类推.

          假设情况柱子有1根,则易得最多通过2个单位青蛙.(D1-->柱1,D2-->B,D1-->B)

          有两根时,我们模拟过程:D1-->柱1,D2-->柱2,这个时候第一这个整体可以满足条件跳到D2头上,D1-->柱2,之后,柱1空着,加入D3,D3-->柱1,

          但此时D2被压在下面,所以就没有骚操作可以再进行了,只能加入D4直接跳到B.然后依次全部跳到B.得出结论.h=2时 通过4个单位.

          当没有柱子时,显然只有一个单位通过.观察结论,得出公式:当有k荷叶,h柱时,可通过青蛙(k+1)*2^h只.

          答案就出来了,虽然代码很简单,但还是贴一下.

#include<iostream>
#include<math.h>
using namespace std;
int main()
{
    int i,j,m,h,k,a;
    while(cin>>h>>k)
    cout<<(k+1)*pow(2,h)<<endl;
}

希望各位在写完后可以为(k+1)*2^h只青蛙奉献出(k+1)*2^h秒,不然他们可能会非常angry.

 

PS 这题我没用DP,标签摘了洛谷的~

 

posted @ 2017-06-08 20:41  啾啾猫猫  阅读(470)  评论(0编辑  收藏  举报