题意
从1号格走到n号格,包里有b双靴子,每双靴子有自己的属性(可踩的深度,步长),但这些靴子只能按顺序使用,换时需抛弃上一双靴子,且可踩在这格子上(不穿抛弃即可),求出最少丢的鞋子。
思路
设f[i]为踩到第i个格子最少换的鞋子,这样我们可以确定当前格子穿的是哪个鞋子在走,然后枚举换到的鞋子,从相应的步长向符合条件的格子走, O ( N 3 ) O(N^3) O(N3)可过。
代码
#include <cstdio>
#include <cstring>
#include <algorithm>
int n, b;
int a[251], s[251], d[251], f[251];
int main() {
scanf("%d %d", &n, &b);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= b; i++)
scanf("%d %d", &s[i], &d[i]);
memset(f, 127 / 3, sizeof(f));
f[1] = 0;
for (int i = 1; i <= n; i++) {
if (f[i] == 707406378) continue;
for (int k = f[i] + 1; k <= b; k++)
for (int j = 1; j <= d[k] && i + j <= n; j++)
if (a[i + j] <= s[k] && a[i] <= s[k]) f[i + j] = std::min(k - 1, f[i + j]);
}
printf("%d", f[n]);
}