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

- 石墩上可以承受任意多只青蛙,荷叶只能承受一只青蛙(不论大小);
- 青蛙可以:A→B(表示可以从 A 跳到 B,下同),A→C,A→D,C→B,D→B,D→C,C→D;
- 当一个石墩上有多只青蛙时,则上面的青蛙只能跳到比它大一号的青蛙上面。
你的任务是对于给出的 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;
}

浙公网安备 33010602011771号