萌新刚刚学DP,求助qwq
查看原帖
萌新刚刚学DP,求助qwq
198719
洛璟楼主2021/3/8 11:56

萌新单调队列优化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;

}
2021/3/8 11:56
加载中...