2697-修建草坪
本文总阅读量次
题目传送
思考方向
题目要求区间长度不超过
比如样例:1 2 3 4 5
按照贪心策略,第一个区间中选择1,然后2和3保留,接下来选4,保留5,最终效率之和为10。
而答案为12,即3不保留,其他都保留。
所以不把所有情况枚举一遍,无法确定最优。
假设
观察上图,在区间
如果用枚举,
只要在区间范围内,队列中的某个决策可能会被使用多次,这就具备了最优子结构。
子问题一旦构造出来了,现在思考一下状态转移方程,单调队列DP优化跟区间有关,所以:
即第
for(int i = 1; i <= n; i++){
dp[i] = q[head]+cow[i]; //转移:计算出当前第i个不放入的最小值之和
while(head <= tail && i - pos[head] > k) ++head; //区间外的出队
while(head <= tail && q[tail] >= dp[i]) --tail; //调整队列单调性
q[++tail] = dp[i];
pos[tail] = i;
}
最后,在
long long ans = 2e18;
for(int i = n-k; i <= n; ++i) ans = min(ans, dp[i]);
cout << sum - ans << "\n"; //sum为整个序列的总和