R2_G_Snow Boots

题面

G. Snow Boots

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

It’s winter on the farm, and that means snow! There are NN tiles on the path from the farmhouse to the barn, conveniently numbered 1…N1…N, and tile ii is covered in fifi feet of snow.

Farmer John starts off on tile 11 and must reach tile NN to wake up the cows. Tile 11 is sheltered by the farmhouse roof, and tile NN 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!

扫描二维码关注公众号,回复: 5536847 查看本文章

In his foul-weather backpack, Farmer John has BB pairs of boots, numbered 1…B1…B. Some pairs are more heavy-duty than others, and some pairs are more agile than others. In particular, pair ii lets FJ step in snow at most sisi feet deep, and lets FJ move at most didi 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 ff feet of snow, both the boots he takes off AND the boots he puts on must be able to withstand at least ff 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 NN and BB (2≤N,B≤2502≤N,B≤250).

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

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

The boots are described in top-to-bottom order, so pair 11 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.

Example

input

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

output

2

题目大意

N N 个点,第1和最后一个点雪深为0,其他的点都有雪。然后John有B双鞋子。每双鞋子所能承受的雪深是不一样的。所能走的最大距离也是不一样的。John走在某个点上必须要穿鞋,那鞋子所能承受的雪深要比这个点的雪深要大。当当前的鞋不能走动时,可以选择换鞋子。换上的鞋子也必须得承受当前的点的雪深。鞋子在背包里只能按顺序拿,要拿最下面的鞋子必须得拿出上面的鞋子。鞋子可以直接丢掉。问John要走过这条路所丢掉的最小鞋子是多少双。

题目分析

DP或者记忆化搜索都行。我们假定 d p [ x ] [ k ] dp[x][k] 是在 x x 点丢掉了 k k 双鞋子。那么显然在 d p [ f N ] [ k ] = k dp[f_N][k]=k ,在终点的时候丢掉了几双鞋就是丢掉了几双鞋。而$dp[x][k] 则等于 min(dp[x+j][k + i])(x+j\le f_N,k+i < B)$(不能连最后一双鞋都丢掉了吧)。即转移方程是
d p [ x ] [ k ] = m i n ( d p [ x + j ] [ k + i ] ) ( x + j f N , k + i &lt; B ) dp[x][k] = min(dp[x+j][k + i])(x+j\le f_N,k+i &lt; B)

f [ x + j ] s [ k + i ]  且  f [ x ] s [ k + i ] f[x + j] \le s[k + i] \space \text{且}\space f[x] \le s[k + i]

当脱光了鞋子都不能到达目标的时候,返回一个巨大的值表示不能到达。这里要注意 f [ x ] s [ k + i ] f[x] \le s[k + i] 这个条件,换上的鞋也要能承受当前点的重量。这是很容易遗忘的。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int N, B;
int f[260], s[260], d[260];
int dp[260][260];
int dfs(int x, int k){
  if(dp[x][k] != -1)
    return dp[x][k];
  if(x >= N)
    return dp[x][k] = k;
  if(k >= B + 1)
    return dp[x][k] = inf;
  int ans = inf + 7;
  for(int i = 0; k + i < B; i++){
    for(int j = 1; j <= d[k + i]; j++){
      if(x + j <= N && f[x + j] <= s[k + i] && f[x] <= s[k + i]){
        ans = min(ans, dfs(x + j, k + i));
      }
    }
  }
  return dp[x][k] = ans;
}
int main(int argc, char const *argv[]) {
  scanf("%d%d", &N, &B);
  for(int i = 0; i < N; i++)
    scanf("%d", &f[i]);
  for(int i = 0; i < B; i++)
    scanf("%d%d", &s[i], &d[i]);
  memset(dp, -1, sizeof(dp));
  printf("%d\n", dfs(0, 0));
  return 0;
}

猜你喜欢

转载自blog.csdn.net/IT_w_TI/article/details/87869588
今日推荐