萌新单调队列优化DP打挂了qwq
求大佬看看qwqwq
#include<bits/stdc++.h>
#define int long long
#define INF 1e18
using namespace std;
int n, m, k;
int a[5010];
int f[5010][5010];
deque<int> q[5010];
inline int read()
{
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c>'9')
{
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9')
{
x = (x << 3) + (x << 1) + (c ^ '0');
c = getchar();
}
return x * f;
}
signed main()
{
n = read();
k = read();
m = read();
for (int i = 1;i <= n;++i)
{
a[i] = read();
}
if (n / k > m)
{
printf("-1");
return 0;
}
for (int i = 0;i <= n;++i)
{
for (int j = 0;j <= m;++j)
{
f[i][j] = -1e18;
}
}
f[0][0] = 0;
q[0].push_back(0);
for (int i = 1;i <= n;++i)
{
for (int j = m;j >= 1;--j)
{
while (q[j - 1].size() != 0 && q[j - 1].front() < i - k)
{
q[j - 1].pop_front();
}
if (q[j - 1].size() != 0)
{
f[i][j] = f[q[j - 1].front()][j - 1] + a[i];
while (q[j].size() != 0 && f[q[j].back()][j] <= f[i][j])
q[j].pop_back();
q[j].push_back(i);
}
}
}
int ans = -0x3f3f3f3f;
for (int i = 1;i <= n;++i)
{
ans = max(ans, f[i][m]);
}
printf("%lld", ans);
return 0;
}