洛谷 [SCOI2010]股票交易 | 单调性DP

Posted MSPqwq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了洛谷 [SCOI2010]股票交易 | 单调性DP相关的知识,希望对你有一定的参考价值。

题目链接

#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 2005
using namespace std;
int n,q[N],ap,bp,dp[N][N],as,bs,m,w;
int main()
{
    scanf("%d%d%d",&n,&m,&w);
    memset(dp,128,sizeof(dp));
    for (int i=1;i<=n;i++)
    {
    scanf("%d%d%d%d",&ap,&bp,&as,&bs);
    for (int j=0;j<=as;j++) dp[i][j]=-1*j*ap;
    for (int j=0;j<=m;j++) dp[i][j]=max(dp[i][j],dp[i-1][j]);
    if (i<=w) continue;
    int l=1,r=0;
    for (int j=0;j<=m;j++)
    {
        while (l<=r && q[l]<j-as) l++;
        while (l<=r && dp[i-w-1][q[r]]+q[r]*ap<=dp[i-w-1][j]+j*ap) r--;
        q[++r]=j;
        if (l<=r) dp[i][j]=max(dp[i][j],dp[i-w-1][q[l]]+q[l]*ap-j*ap);
    }
    l=1,r=0;
    for (int j=m;j>=0;j--)
    {
        while (l<=r && q[l]>j+bs) l++;
        while (l<=r && dp[i-w-1][q[r]]+q[r]*bp<=dp[i-w-1][j]+j*bp) r--;
        q[++r]=j;
        dp[i][j]=max(dp[i][j],dp[i-w-1][q[l]]+q[l]*bp-j*bp);
    }
    }
    printf("%d\n",dp[n][0]);
    return 0;
}

 

以上是关于洛谷 [SCOI2010]股票交易 | 单调性DP的主要内容,如果未能解决你的问题,请参考以下文章

1855: [Scoi2010]股票交易[单调队列优化DP]

BZOJ1855[Scoi2010]股票交易 DP+单调队列

[bzoj1855][Scoi2010]股票交易_动态规划_单调队列

luogu P2569 [SCOI2010]股票交易 单调优化dp

BZOJ1855 [Scoi2010]股票交易 单调队列优化dp

P2569 [SCOI2010]股票交易 dp 单调队列优化