zoukankan      html  css  js  c++  java
  • 题解 P2569 【[SCOI2010]股票交易】

    题目链接:Link

    Problem

    Solution

    定义状态如下:
    $ f(i,j) $ = 第i天结束后,手中有j股的最大收益
    初始化: $ f(i,j)=-infty quad f(0,0)=0 $
    不妨发现有如下选择:

    1. 什么都不做,此时 $ f(i,j)=f(i-1,j) $ 。
    2. $ j le as_i $ ,干第一票,此时 $ f(i,j)=-j*ap_i $ 。
    3. 进行卖出,此时: $ f(i,j)=maxlimits_{ j < k le j+bs_i }{ f(i-w-1,k)+(k-j)*bp_i } $ 。
    4. 进行买入,此时: $ f(i,j)=maxlimits_{ j-as_i le k < j }{ f(i-w-1,k)-(j-k)*ap_i } $ 。

    整理后,不难发现第3种和第4种情况可以用单调队列维护,总时间复杂度 $ O(n*m) $ .

    Code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int maxn=2005;
    const LL oo=0x3f3f3f3f3f3f3f3fll;
    int n,m,w;
    LL res,ap[maxn],bp[maxn],as[maxn],bs[maxn],f[maxn][maxn];
    int que[maxn],L,R;
    int main()
    {
    	#ifdef local
    	freopen("pro.in","r",stdin);
    	#endif
    	scanf("%d%d%d",&n,&m,&w);
    	for(int i=1;i<=n;i++) scanf("%lld%lld%lld%lld",&ap[i],&bp[i],&as[i],&bs[i]);
    	for(int i=1;i<=m;i++) f[0][i]=-oo;
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=0;j<=m;j++) f[i][j]=f[i-1][j];
    		for(int j=0;j<=as[i];j++) f[i][j]=max(f[i][j],-j*ap[i]);
    		if(i-w-1<0) continue;
    		que[L=R=1]=0;
    		for(int j=1;j<=m;j++)
    		{
    			while(L<=R&&j-que[L]>as[i]) L++;
    			if(L<=R) { int k=que[L]; f[i][j]=max(f[i][j],f[i-w-1][k]-(j-k)*ap[i]); }
    			while(L<=R&&f[i-w-1][j]+j*ap[i]>=f[i-w-1][que[R]]+que[R]*ap[i]) R--;
    			que[++R]=j;
    		}
    		que[L=R=1]=m;
    		for(int j=m-1;j>=0;j--)
    		{
    			while(L<=R&&que[L]-j>bs[i]) L++;
    			if(L<=R) { int k=que[L]; f[i][j]=max(f[i][j],f[i-w-1][k]+(k-j)*bp[i]); }
    			while(L<=R&&f[i-w-1][j]+j*bp[i]>=f[i-w-1][que[R]]+que[R]*bp[i]) R--;
    			que[++R]=j;
    		}
    		for(int j=0;j<=m;j++) res=max(res,f[i][j]);
    	}
    	printf("%lld
    ",res);
    	return 0;
    }
    
  • 相关阅读:
    CSRF攻击原理
    大前端
    尊敬自己,才能拥有改变的力量
    重温尼采语录 序章
    人生的弹性 -- 观《聚宝盆》有感
    求学梦
    爱国情怀
    雾中见我
    找东西
    走在路上的感悟
  • 原文地址:https://www.cnblogs.com/happyZYM/p/11618088.html
Copyright © 2011-2022 走看看