UVa11157 - Dynamic Frog(动态规划)

Withthe increased use of pesticides, the local streams and rivers have become socontaminated that it has become almost impossible for the aquatic animals tosurvive.

Frog Fred is on the left bank of such a river. Nrocks are arranged in a straight line from the left bank to the right bank. Thedistance between the left and the right bank is D meters. There arerocks of two sizes. The bigger ones can withstand any weight but the smallerones start to drown as soon as any mass is placed on it. Fred has to go to theright bank where he has to collect a gift and return to the left bank where hishome is situated.

He can land on every small rock at most one time,but can use the bigger ones as many times as he likes. He can never touch thepolluted water as it is extremely contaminated.

Can you plan the itinerary so that the maximumdistance of a single leap is minimized?

 

Input

The first line of input is an integer T(T<100) that indicatesthe number of test cases. Each case starts with a line containing two integers N(0≤N≤100)and D(1≤D≤1000000000). The next line gives the descriptionof the N stones. Eachstone is defined by S-M. Sindicates the type Big(B) or Small(S)and M(0<M<D)determines the distance of that stone from the left bank. The stones will begiven in increasing order of M.

Output

For every case, output the case number followed by the minimized maximumleap.

Sample Input

Output for Sample Input

3
1 10
B-5
1 10
S-5
2 10
B-3 S-6
Case 1: 5
Case 2: 10
Case 3: 7
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>

using namespace std;

const int N = 110;

int memo[N][N];

struct Rock
{
    char kind;
    int size;
};

Rock rock[N];
int n, d;

bool input();
int solve();
int dp(int i, int j);

int main()
{
#ifndef ONLINE_JUDGE
    freopen("d:\\OJ\\uva_in.txt", "r", stdin);
#endif // ONLINE_JUDGE

    int t;
    scanf("%d", &t);
    for (int i = 1; i <= t; i++) {
        input();
        int ans = solve();
        printf("Case %d: %d\n", i, ans);
    }

    return 0;
}

bool input()
{
    scanf("%d", &n);
    rock[0].kind = 'B', rock[0].size = 0;
    rock[n + 1].kind = 'B';
    scanf("%d", &rock[n + 1].size);

    for (int i = 1; i <= n; i++) {
        scanf(" %c-%d", &rock[i].kind, &rock[i].size);
    }

    return true;
}

int solve()
{
    memset(memo, 0xff, sizeof(memo));
    return dp(0, 0);
}

int dp(int i, int j)
{
    int &res = memo[i][j];

    if (res != -1) return res;

    res = 1 << 30;
    if (i > n && j > n) return res = 0;

    if (i <= j) {
        for (int t = i; t <= n + 1; t++) {
            if (t == j && rock[t].kind != 'B') continue;
            res = min(res, max(rock[t].size - rock[i].size, dp(t, j)));
        }
    } else {
        for (int t = j; t <= n + 1; t++) {
            if (t == i && rock[t].kind != 'B') continue;
            res = min(res, max(rock[t].size - rock[j].size, dp(i, t)));
        }
    }

    return res;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值