问题描述
小R需要在N天的徒步旅行中每天消耗1份食物,每天可在补给站购买食物。限制条件:
- 购买后携带量 ≤ K
- 必须确保当天有食物可用
求完成旅行的最小花费
输入输出
输入:
- n:总天数
- k:最大携带量
- data[]:每天的食物价格
输出:
- 完成旅行的最小花费
核心思路
关键观察
- 价格窗口期:当某天价格是后续区间内的最低价时,应尽可能多买
- 库存管理:需要跟踪剩余食物量来避免重复购买
- 动态规划状态:
dp[i][f]
表示第i天开始时有f份食物的最小花费
算法框架
- 预处理:使用单调栈找到每个位置右侧第一个更低价格的位置
- 动态规划:维护库存状态,计算最优购买策略
详细解法步骤
步骤1:预处理Next Lower数组
int[] nextLower = new int[n];
Deque<Integer> stack = new ArrayDeque<>();
for (int i = n-1; i >= 0; i--) {
while (!stack.isEmpty() && data[stack.