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 ) ----------------------------------…
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,…
设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=…
题目: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 的范围里在强制选的后缀…
Sol 一个很显然的暴力,设\(f[i]\)表示选到\(i\)的最优效率 每次枚举一段不与前面连续的长度小于\(k\)的区间转移来 # include <bits/stdc++.h> # define RG register # define IL inline # define Fill(a, b) memset(a, b, sizeof(a)) using namespace std; typedef long long ll; const int _(1e5 + 5); IL int I…
传送门 单调队列优化dp板子 表示不大想写详细做法,自己看代码吧qwq (懒) 注意细节,不然就会跟我一样WA4次 // luogu-judger-enable-o2 #include<bits/stdc++.h> #define LL long long #define il inline #define re register #define db double #define eps (1e-5) using namespace std; const int N=100000+10; i…
传送门 这题的DP真是刷新了我的理解,竟然还要用队列优化.... #include<iostream> #include<cstdio> using namespace std; ; long long ans,n,k; ; long long a[maxn],f[maxn],q[maxn]; inline int read() { ,f=;char c=getchar(); ; +c-'; return x*f; } int main() { n=read(); k=read()…