社区讨论

求条 单调队列5分

P5858「SWTR-3」Golden Sword参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhz4ez1p
此快照首次捕获于
2025/11/15 01:17
3 个月前
此快照最后确认于
2025/11/16 13:55
3 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[5009],f[5009][5009];
int q[5009],F,r;
signed main()
{
    int n,w,s;
    cin>>n>>w>>s;
    for(int i=1;i<=n;i++)cin>>a[i];
    memset(f,0x80,sizeof f); //10000000100000001000000010000000
    //f[i][j]表示第i个物品处理完成后,锅中有j个原料的最大耐久
    f[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        F=0,r=1;
        q[1]=w;
        for(int j=1;j<=min(i,w);j++)
        {
            //拿完后有j-1个
            //最多拿出s个,j+s-1
            //不能超w,min(j+s-1,w)为上限,j-1为下限
            //考虑使用单调队列优化dp
            //每次都把队列清空
            while(F<r&&q[F+1]>min(j+s-1,w))F++;
            while(F<r&&f[i-1][q[r]]<=f[i-1][j-1])r--;
            q[++r]=j-1;
            f[i][j]=f[i-1][q[F+1]]+a[i]*j;
        }
    }
    cout<<*max_element(f[n],f[n]+w+1);
}
单调队列5pts5pts太6了。

回复

1 条回复,欢迎继续交流。

正在加载回复...