Code: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define setIO(s) freopen(s".in","r",stdin) #define N 100010 #define ll long long using namespace std; ll n, k, maxn, ans, head = 1,…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2442 考虑记录前 i 个.末尾 j 个连续选上的最大值.发现时空会爆. 又发现大量的转移形如 dp[ i ][ j ] = dp[ i-1 ][ j-1 ]+a[ i ]. 再结合自己求答案要遍历 j = i ~ j - k ,就觉得可以只记录一个 i ,在 i 到 i - k 的范围强制选后面连续的一段,并让转移来的dp的后面一个强制不选. 这样在 i 到 i-k 的范围里在强制选的后缀…
dp dp[ i ] 表示第 i 个不选 , 前 i 个的选择合法的最小损失 , dp[ i ] = min( dp[ j ] ) ( max( 0 , i - 1 - k ) <= j <= i - 1 ) , 符合条件的 j 是一段连续的区间并且随着 i 的增大而增大 , 可以用单调队列维护 , ans = tot - min( dp[ k ] ) ( max( 0 , i - k ) <= k <= n ) ----------------------------------…
设f[i]为i不选的最小损失,转移是f[i]=f[j]+e[i[(i-j-1<=k) 因为f是单调不降的,所以f[j]显然越靠右越好因为i-j-1<=k的限制,所以单调栈需要弹栈 #include<iostream> #include<cstdio> using namespace std; const int N=100005; int n,m,e[N],q[N],l,r; long long f[N],ans,mn=1e18; int read() { int r=…
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 902 Accepted Submission(s): 396 Problem Description Panagola, The Lord of city F lik…
BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在第i棵树,那么他可以跳到第i+1,i+2,...,i+k棵树. 如果MHY跳到一棵不矮于当前树的树,那么他的劳累值会+1,否则不会. 为了有体力和妹子玩,MHY要最小化劳累值. Input There is a single integer N(2<=N<=1 000 000) in the fi…