HDU 3415 Max Sum of Max-K-sub-sequence ( 单调队列 )
来源:互联网 发布:淘宝 法律咨询 靠谱吗 编辑:程序博客网 时间:2024/05/17 08:40
题目链接~~>
做题感悟:看这题是就很有单调队列的赶脚,但是还是花费了很长时间做出来。
解题思路:
动态方程很好推: dp [ i ] = min { sum[ i ] - sum[ j - 1] } i - j + 1 <= k ,我们可以变一下型 ,dp [ i ] = sum[ i ] - min { sum[ j - 1 ] } ,这样 sum[ j - 1 ] 就可以用单调队列来维护了。因为是环形的,可以展开成为两倍。
代码:
#include<iostream>#include<sstream>#include<map>#include<cmath>#include<fstream>#include<queue>#include<vector>#include<sstream>#include<cstring>#include<cstdio>#include<stack>#include<bitset>#include<ctime>#include<string>#include<cctype>#include<iomanip>#include<algorithm>using namespace std ;#define INT long long int#define L(x) (x * 2)#define R(x) (x * 2 + 1)const int INF = 0x3f3f3f3f ;const double esp = 0.0000000001 ;const double PI = acos(-1.0) ;const int mod = 1000000007 ;const int MY = (1<<5) + 5 ;const int MX = 200000 + 5 ;const int S = 20 ;int n ,k ,St ,End ,ans ,m ;int g[MX] ,sum[MX] ,deq[MX] ,deqv[MX] ;void input(){ scanf("%d%d" ,&n ,&k) ; sum[0] = 0 ; for(int i = 1 ;i <= n ; ++i) { scanf("%d" ,&g[i]) ; g[i+n] = g[i] ; } m = n ; n = n*2 ; for(int i = 1 ;i <= n ; ++i) sum[i] = sum[i-1] + g[i] ;}void DP(){ int front = 0 ,end = 0 ,temp ,a1 ,a2 ; St = INF ; ans = -INF ; End = 0 ; ans = -INF ; for(int i = 1 ;i <= n ; ++i) { while(front < end && deqv[end-1] > sum[i-1]) // 去除大于等于此元素的值 end-- ; deq[end] = i-1 ; deqv[end++] = sum[i-1] ; temp = sum[i] - deqv[front] ; if(temp > ans) { ans = temp ; St = deq[front] + 1 ; End = i ; } while(front < end && deq[front] <= i-k) // 去除冗余元素 front++ ; }}int main(){ //freopen("input.txt" ,"r" ,stdin) ; int Tx ; scanf("%d" ,&Tx) ; while(Tx--) { input() ; DP() ; if(St > m) St -= m ; if(End > m) End -= m ; printf("%d %d %d\n" ,ans ,St ,End) ; } return 0 ;}
0 0
- HDU Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence【单调队列】
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- HDU 3415 Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- HDU 3415 Max Sum of Max-K-sub-sequence[单调队列优化dp]
- 【单调队列】hdu 3415 Max Sum of Max-K-sub-sequence
- 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 (单调队列)
- HDU--杭电--3415--Max Sum of Max-K-sub-sequence--暴力或单调队列
- HDU 3415 Max Sum of Max-K-sub-sequence【单调队列】
- HDU--3415--Max Sum of Max-K-sub-sequence--单调队列
- hdu 3415 Max Sum of Max-K-sub-sequence (单调队列)
- 单调队列-hdu-3415-Max Sum of Max-K-sub-sequence
- 单调队列——HDU 3415 Max Sum of Max-K-sub-sequence
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- hdu 3415 Max Sum of Max-K-sub-sequence(单调队列)
- Android开发环境配置
- uvc摄像头代码解析6
- ios 如何做原生分享
- API函数前面::符号的含义
- jquery学习
- HDU 3415 Max Sum of Max-K-sub-sequence ( 单调队列 )
- uvc摄像头代码解析7
- 浅谈New关键字
- Remedy Developer Studio 使用direct sql更新的值,在Remedy中Execution Options中检测不出
- python 类库笔记
- 面向对象和面向过程的区别
- ArcGIS教程:删除重复的要素之---线
- ubuntu 12.04 server ntp同步
- 【iOS开发-73】创建控制器的3种方式、深入了解view的创建和加载顺序