专栏文章
题解:P11793 [JOI 2016 Final] 橙子装箱 / Oranges
P11793题解参与者 3已保存评论 3
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mioalffu
- 此快照首次捕获于
- 2025/12/02 16:04 3 个月前
- 此快照最后确认于
- 2025/12/02 16:04 3 个月前
题目分析
有 个橙子排成一排,每个橙子的大小为 。需要将它们装进若干个箱子里,每个箱子必须装连续的橙子,且最多装 个。每个箱子的成本为 。目标是最小化总成本。
解题思路
使用动态规划(DP)求解:
设 表示装好前 个橙子的最小总成本。对于每个 (),枚举最后一个箱子的起始位置 ( 满足 ),最后一个箱子装橙子 。转移方程为:
其中 。
- 初始状态:(没有橙子时成本为 0)。
- 边界处理:当 时跳过。
在实现时,内层循环从 反向枚举到 ,同时动态维护区间 的最小值和最大值。
代码实现
CPP#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int n, m, k;
cin >> n >> m >> k;
vector<int> A(n + 1);
for (int i = 1; i <= n; i++) {
cin >> A[i];
}
vector<long long> dp(n + 1, LLONG_MAX);
dp[0] = 0;
for (int i = 1; i <= n; i++) {
int min_val = A[i];
int max_val = A[i];
for (int j = i - 1; j >= max(0, i - m); j--) {
if (A[j + 1] < min_val) min_val = A[j + 1];
if (A[j + 1] > max_val) max_val = A[j + 1];
long long cost = k + 1LL * (i - j) * (max_val - min_val);
if (dp[j] != LLONG_MAX) {
if (dp[j] + cost < dp[i]) {
dp[i] = dp[j] + cost;
}
}
}
}
cout << dp[n] << endl;
return 0;
}
相关推荐
评论
共 3 条评论,欢迎与作者交流。
正在加载评论...