Snow Boots(DP)

题目

  • Problem Description
    It’s winter on the farm, and that means snow! There are N tiles on the path from the farmhouse to the barn, conveniently numbered 1…N, and tile i is covered in fi feet of snow.

    Farmer John starts off on tile 1 and must reach tile N to wake up the cows. Tile 1 is sheltered by the farmhouse roof, and tile N is sheltered by the barn roof, so neither of these tiles has any snow. But to step on the other tiles, Farmer John needs to wear boots!

    In his foul-weather backpack, Farmer John has B pairs of boots, numbered 1…B. Some pairs are more heavy-duty than others, and some pairs are more agile than others. In particular, pair i lets FJ step in snow at most si feet deep, and lets FJ move at most di forward in each step.

    Unfortunately, the boots are packed in such a way that Farmer John can only access the topmost pair at any given time. So at any time, Farmer John can either put on the topmost pair of boots (discarding his old pair) or discard the topmost pair of boots (making a new pair of boots accessible).

    Farmer John can only change boots while standing on a tile. If that tile has f feet of snow, both the boots he takes off AND the boots he puts on must be able to withstand at least f feet of snow. Intermediate pairs of boots which he discards without wearing do not need to satisfy this restriction.

    Help Farmer John minimize waste, by determining the minimum number of pairs of boots he needs to discard in order to reach the barn. You may assume that Farmer John is initially not wearing any boots.

  • Input
    The first line contains two space-separated integers N and B(2≤N,B≤250).

    The second line contains N space-separated integers. The iith integer is fi, giving the depth of snow on tile i (0≤fi≤109). It’s guaranteed that f1=fN=0.

    The next B lines contain two space-separated integers each. The first integer on line i+2 is si, the maximum depth of snow in which pair i can step. The second integer on line i+2 is di, the maximum step size for pair i. It’s guaranteed that 0≤si≤109 and 1≤di≤N−1.

    The boots are described in top-to-bottom order, so pair 1 is the topmost pair in FJ’s backpack, and so forth.

  • Output
    The output should consist of a single integer, giving the minimum number of boots Farmer John needs to discard. It’s guaranteed that it will be possible for FJ to make it to the barn.

  • input
    10 4
    0 2 8 3 6 7 5 1 4 0
    2 3
    4 2
    3 4
    7 1

  • output
    2

题意

从1出发到N,每格都有不同的积雪深度
一共有B双鞋子,只能按顺序取出,每双鞋子都有不同的积雪深度限制和步幅限制
求到达N最少需要换几双鞋子

思路

DP,按鞋子顺序,每双鞋子都假设在 通过之前的鞋子可以到达 且 能换上这双鞋子 的地面上换上,然后走,直到没有格子能走,拿出下一双鞋子,重复上面的 步骤,直到到达N点

代码

#include <bits/stdc++.h>
using namespace std;

struct boot {
    int s;
    int d;
} boots[260];
int deep[260];
int dp[260];//dp[n]=b;n=格子,b=第几双鞋子

int main() {
    int N,B;
    while(scanf("%d %d",&N,&B)!=EOF) {
        for(int i=1; i<=N; ++i) 
            scanf("%d",deep+i);
        for(int i=1; i<=B; ++i)
            scanf("%d%d",&boots[i].d,&boots[i].s);

        memset(dp,0,sizeof(dp));
        dp[1]=1;
        for(int i=1; i<=B; ++i) {
        //按顺序遍历出 每双鞋子 在之前能走到的所有格子上都假设换上之后的结果
            for(int j=1; j<=N; ++j) //路
                if(dp[j] and boots[i].d>=deep[j] )
                //之前能走到 且 深度可以允许更换这双鞋子
                    for(int k=j+1; k<=N and k-j<=boots[i].s ; ++k  )
                    //换上鞋子走,k=路
                        if(boots[i].d >= deep[k]) {
                            dp[k]=i;
                        }
            if(dp[N])
                break;
        }
        cout << dp[N]-1<<endl;
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值