P1244 [NOI2000] 青蛙过河

题目描述

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

img

  1. 石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);
  2. 青蛙可以:AB(表示可以从 A 跳到 B,下同),ACADCBDBDC,CD
  3. 当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大一号的青蛙上面。

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

输入格式

输入两个整数 h,k

输出格式

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

分析

如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

代码

#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int dp[1005][1005];
int main()
{
    int n, m;
    scanf("%d%d", &n, &m); // n个石头 m个荷叶

    dp[0][0] = 1;
    for (int i = 1; i <= n; i++)
    {
        dp[i][0] = dp[i - 1][0] * 2;
        for (int j = 1; j <= m; j++)
        {
            dp[0][j] = j + 1;
            dp[i][j] = max(dp[i - 1][j] * 2, dp[i][j - 1] / j * (j + 1));
        }
    }
    printf("%d\n", dp[n][m]);
    return 0;
}
posted @ 2022-02-19 10:20  亚托莉的亚托莉  阅读(136)  评论(0)    收藏  举报