HDU 3415 (单调队列优化DP)
2012-12-26 15:32
429 查看
http://acm.hdu.edu.cn/showproblem.php?pid=3415
题意:给出n个数a1,a2……,an,围成一个圈,问从中选出连续的m个数(1 <= m <= k),这些数之和最大是多少。
因为要围圈,很容易想到处理时用将数据加倍存储,就可以达到围圈的效果。求连续的数之和,很明显可以预处理部分和来优化。然后从1->2n依次枚举,dp[i] = max(sum[i] – sum[j]),j < i && i - j <= k。但题目说明k <= n,也就是说暴力枚举的话,复杂度最大为O(n^2),必然会TLE的。max(sum[i] - sum[j]) 等价于 sum[i] - min(sum[j]),于是可以维护一个单调队列,可以直接得到min(sum[j]),于是就可以解决了。在输出答案时,题目有3个优先级要求的,我抱着Wa的心理尝试提交后,AC了,觉得那个有点纸老虎的感觉……不过真的挺吓人的说~
代码:
题意:给出n个数a1,a2……,an,围成一个圈,问从中选出连续的m个数(1 <= m <= k),这些数之和最大是多少。
因为要围圈,很容易想到处理时用将数据加倍存储,就可以达到围圈的效果。求连续的数之和,很明显可以预处理部分和来优化。然后从1->2n依次枚举,dp[i] = max(sum[i] – sum[j]),j < i && i - j <= k。但题目说明k <= n,也就是说暴力枚举的话,复杂度最大为O(n^2),必然会TLE的。max(sum[i] - sum[j]) 等价于 sum[i] - min(sum[j]),于是可以维护一个单调队列,可以直接得到min(sum[j]),于是就可以解决了。在输出答案时,题目有3个优先级要求的,我抱着Wa的心理尝试提交后,AC了,觉得那个有点纸老虎的感觉……不过真的挺吓人的说~
代码:
// 187 MS #include <iostream> #include <cstring> #include <cstdio> #define inf 1e9 using namespace std; int sum[200010]; pair<int, int> que[200010]; // first保存的是sum[i]值,second保存的是i值 int main() { int Case, n, k; scanf("%d", &Case); while (Case--) { scanf("%d %d", &n, &k); sum[0] = 0; int t; for (int i = 1; i <= n; ++i) { scanf("%d", &t); sum[i] = sum[i-1] + t; } for (int i = n+1; i <= 2*n; ++i) sum[i] = sum[i-1] + (sum[i-n] - sum[i-n-1]); // 求部分和 // 单调队列优化的部分和求解 int head = 0, tail = 0; int Max = -inf, s, e; que[0].first = 0, que[0].second = 0; for (int i = 1; i <= 2*n; ++i) { while (head <= tail && que[head].second < i - k) head++; int u = sum[i] - que[head].first; if (u > Max) { Max = u; s = que[head].second + 1; e = i; } while (head <= tail && que[tail].first > sum[i]) tail--; que[++tail].first = sum[i]; que[tail].second = i; } if (s > n) s -= n; if (e > n) e -= n; printf("%d %d %d\n", Max, s, e); } return 0; }
相关文章推荐
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
- HDU 3415 Max Sum of Max-K-sub-sequence - dp&单调队列优化
- HDU 3415(Max Sum of Max-K-sub-sequence-单调队列优化DP)
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
- hdu 3401 单调队列优化dp
- hdu 3401 Trade 单调队列优化dp
- HDU 3401 Trade (单调队列优化DP)
- hdu 3401 单调队列优化dp
- hdu 1171 Dividing 单调队列优化dp
- hdu 5945 Fxx and Game dp(单调队列优化)
- 【HDU 5945】 Fxx and game 【单调队列优化dp】
- 股票交易 【SCOI 2010】HDU 3401 (单调队列优化DP入门)
- hdu 3401 Trade(单调队列优化dp)
- hdu 4374 dp+单调队列优化
- hdu 3401 单调队列优化+dp
- HDU 4374 One hundred layer(单调队列优化dp)
- hdu Parade(单调队列优化 dp)
- Hdu 3401 题解 单调队列优化DP
- HDU 5945 Fxx and game (DP+单调队列优化)
- HDU 4374 One hundred layer(DP+单调队列优化)