zoukankan      html  css  js  c++  java
  • LUOGU P2569 [SCOI2010]股票交易(单调队列优化dp)

    传送门

    解题思路

      不难想一个(O(n^3))(dp),设(f_{i,j})表示第(i)天,手上有(j)股的最大收益,因为这个(dp)具有单调性,所以(f_i)可以贪心的直接从(f_{i-w-1})那一层转移来,转移时枚举一下当前买卖多少。考虑优化,发现每次其实就是一个区间取(max),是由(AS)(BS)所限制的区间,所以单调队列优化就好了,一个正着做一个倒着做,时间复杂度(O(n^2))

    代码

    #include<bits/stdc++.h>
    
    using namespace std;
    const int N=2005;
    
    inline int rd(){
    	int x=0,f=1; char ch=getchar();
    	while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
    	while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
    	return f?x:-x;
    }
    
    int n,Maxp,w,f[N][N],AP[N],BP[N],AS[N],BS[N];
    int Q[N],head,tail;
    
    int main(){
    	memset(f,-0x3f,sizeof(f));
    	n=rd(),Maxp=rd(),w=rd(); f[0][0]=0;
    	for(int i=1;i<=n;i++)
    		AP[i]=rd(),BP[i]=rd(),AS[i]=rd(),BS[i]=rd();
    	for(int i=1;i<=n;i++){
    		head=1; tail=0; f[i][0]=f[i-1][0];
    		int Max=max(0,i-w-1);
    		for(int j=1;j<=Maxp;j++){
    			f[i][j]=f[i-1][j];
    			if(j-Q[head]>AS[i]) head++;
    			while(head<=tail && f[Max][j-1]-AP[i]>f[Max][Q[tail]]-AP[i]*(j-Q[tail])) tail--;
    			Q[++tail]=j-1; f[i][j]=max(f[i][j],f[Max][Q[head]]-AP[i]*(j-Q[head]));
    //			for(int k=1;k<=AS[i];k++){
    //				if(k>j) break;
    //				f[i][j]=max(f[i][j],f[max(0,i-w-1)][j-k]-AP[i]*k);
    //			}
    //			for(int k=1;k<=BS[i];k++){
    //				if(j+k>Maxp) break;
    //				f[i][j]=max(f[i][j],f[max(0,i-w-1)][j+k]+BP[i]*k);
    //			}
    		}
    		head=1; tail=0;
    		for(int j=Maxp-1;j>=0;j--){
    			if(Q[head]-j>BS[i]) head++;
    			while(head<=tail && f[Max][j+1]+BP[i]>f[Max][Q[tail]]+BP[i]*(Q[tail]-j)) tail--;
    			Q[++tail]=j+1; f[i][j]=max(f[i][j],f[Max][Q[head]]+BP[i]*(Q[head]-j));
    		}
    	}
    	/*
    	for(int i=1;i<=n;i++)
    		for(int j=0;j<=Maxp;j++)
    			printf("f[%d][%d]=%d
    ",i,j,f[i][j]);
    	*/
    	printf("%d
    ",f[n][0]);
    	return 0;
    }
    
  • 相关阅读:
    python的struct模块
    Linux程序设计学习笔记(独乐乐版)
    理解AndroidX
    Android中的样式和主题
    Android中Fragment的使用
    Android 中Dialog的使用
    直接在apk中添加资源的研究
    Android签名生成和互转
    简单扒一下Volley源码,扩展Volley生命周期
    获取android所有联系人信息
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/10560371.html
Copyright © 2011-2022 走看看