1 条题解
-
0
我们考虑从前往后和从后往前进行线性DP,得到 为游玩前 个游乐设施,花费 元的最大快乐值; 为游玩后 个游乐设施,花费 元的最大快乐值。
那么对于兔儿子想要游玩的第 个游乐设施,当 时无解;反之我们可以枚举游玩前 个游乐设施的开销 进行计算答案:
$$ans = \mathop{\max}_{0 \leq g \leq k-c_{idx}} f_{idx-1,g}+ h_{idx}+ g_{idx+1,k-g-c_{idx}} $$时间复杂度:
const int maxn = 2e3 + 7; int n, k, q, h[maxn], c[maxn]; int f[maxn][maxn], d[maxn][maxn]; void solve() { cin >> n >> k >> q; for (int i = 1; i <= n; i++) cin >> h[i] >> c[i]; for (int i = 1; i <= n; i++) { for (int j = 0; j <= k; j++) f[i][j] = f[i - 1][j]; for (int j = c[i]; j <= k; j++) f[i][j] = max(f[i][j], f[i - 1][j - c[i]] + h[i]); } for (int i = n; i >= 1; i--) { for (int j = 0; j <= k; j++) d[i][j] = d[i + 1][j]; for (int j = c[i]; j <= k; j++) d[i][j] = max(d[i][j], d[i + 1][j - c[i]] + h[i]); } while (q--) { int x; cin >> x; if (c[x] > k) { cout << -1 << endl; continue; } int ans = h[x]; for (int i = 0; i <= k - c[x]; i++) ans = max(ans, h[x] + f[x - 1][i] + d[x + 1][k - c[x] - i]); cout << ans << endl; } }
- 1
信息
- ID
- 7
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 2
- 上传者