Trade

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2918    Accepted Submission(s): 930

Problem Description
Recently, lxhgww is addicted to stock, he finds some regular patterns after a few days' study.

He forecasts the next T days' stock market. On the i'th day, you can buy one stock with the price APi or sell one stock to get BPi.
 

There are some other limits, one can buy at most ASi stocks on the i'th day and at most sell BSi stocks.

Two trading days should have a interval of more than W days. That is to say, suppose you traded (any buy or sell stocks is regarded as a trade)on the i'th day, the next trading day must be on the (i+W+1)th day or later.

What's more, one can own no more than MaxP stocks at any time.

Before the first day, lxhgww already has infinitely money but no stocks, of course he wants to earn as much money as possible from the stock market. So the question comes, how much at most can he earn?

 
Input
The first line is an integer t, the case number.

The first line of each case are three integers T , MaxP , W .

(0 <= W < T <= 2000, 1 <= MaxP <= 2000) .

The next T lines each has four integers APi,BPi,ASi,BSi( 1<=BPi<=APi<=1000,1<=ASi,BSi<=MaxP), which are mentioned above.

 
Output
The most money lxhgww can earn.
 
Sample Input
1
5 2 0
2 1 1 1
2 1 1 1
3 2 1 1
4 3 1 1
5 4 1 1
 
Sample Output
3
 
Author
lxhgww
 
Source
 
Recommend
lcy
这里错了好多次了,首先,我们可以得出dp[i][j]=fmax(dp[i][k]+ap[ii]*(k-j),dp[i][k]+bp[ii]*(k-j)) dp[i][j]表求第i天有j只,这样,复杂度太高了,我们可以发现,我们就可以通过dp[i][j]的先一天得到最大值,这样我们就可以减成n^3了,我们可以把dp[i][k]+bp[i]*k 和dp[i][k]+ap[i][k],用一个单调队列存起来,这样可以优化成了n^2,也就可以过了,但是要注意,这里,一定要把小于m的开始单独初始化,这里易错!
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
#define MAXN 2005
#define inf -1000000000
int ap[MAXN],bp[MAXN],as[MAXN],bs[MAXN],dp[MAXN][MAXN],queuea[MAXN],queueb[MAXN],maxp;
int fmax(int a,int b)
{
if(a>b)
return a;
return b;
}
int ffa(int i,int k,int ii)
{
return dp[i][k]+k*bp[ii];
}
int ffb(int i,int k,int ii)
{
return dp[i][k]-(maxp-k)*ap[ii];
}
int main()
{
int tcase,i,ii,j,k,n,m,s,e,l,r;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%d%d%d",&n,&maxp,&m);
for(i=1;i<=n;i++)
{
scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);
}
for(i=1;i<=m+1;i++)
for(j=0;j<=maxp;j++)
{
dp[i][j]=(j<=as[i])?-ap[i]*j:inf;
if(i>1)dp[i][j]=fmax(dp[i][j],dp[i-1][j]);
}
for(ii=m+2;ii<=n;ii++)
{
i=ii-m-1; l=0;r=-1;
for(j=0;j<=maxp;j++)
{
while(l<=r&&ffb(i,j,ii)>ffb(i,queueb[r],ii))
{
r--;
}
queueb[++r]=j;
while(((j-queueb[l]>as[ii])))
{
l++;
}
k=queueb[l];
dp[ii][j]=fmax(dp[ii-1][j],dp[i][k]+ap[ii]*(k-j));
}
s=0;e=-1; ; for(j=maxp;j>=0;j--)
{ while(s<=e&&ffa(i,j,ii)>ffa(i,queuea[e],ii))
{
e--;
}
queuea[++e]=j;
while((queuea[s]-j>bs[ii]))
{
s++;
}
k=queuea[s];
dp[ii][j]=fmax(dp[ii][j],dp[i][k]+bp[ii]*(k-j)); } }
int maxx=dp[n][0];
printf("%d\n",dp[n][0]);
} return 0;
}

hdu3401 Trade 单调队列优化dp的更多相关文章

  1. HDU-3401 Trade 单调队列优化DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3401 DP方程容易想出来,f[i][j]表示第i天拥有j个股票的最优解,则: 1.不买不卖,f[i][ ...

  2. hdu3401:单调队列优化dp

    第一个单调队列优化dp 写了半天,最后初始化搞错了还一直wa.. 题目大意: 炒股,总共 t 天,每天可以买入na[i]股,卖出nb[i]股,价钱分别为pa[i]和pb[i],最大同时拥有p股 且一次 ...

  3. 【单调队列优化dp】HDU 3401 Trade

    http://acm.hdu.edu.cn/showproblem.php?pid=3401 [题意] 知道之后n天的股票买卖价格(api,bpi),以及每天股票买卖数量上限(asi,bsi),问他最 ...

  4. 单调队列优化DP,多重背包

    单调队列优化DP:http://www.cnblogs.com/ka200812/archive/2012/07/11/2585950.html 单调队列优化多重背包:http://blog.csdn ...

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

    1855: [Scoi2010]股票交易 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1083  Solved: 519[Submit][Status] ...

  6. 单调队列优化DP——习题收集

    前言 感觉可以用单调队列优化dp的模型还是挺活的,开个随笔记录一些遇到的比较有代表性的模型,断续更新.主要做一个收集整理总结工作. 记录 0x01 POJ - 1821 Fence,比较适合入门的题, ...

  7. bzoj1855: [Scoi2010]股票交易--单调队列优化DP

    单调队列优化DP的模板题 不难列出DP方程: 对于买入的情况 由于dp[i][j]=max{dp[i-w-1][k]+k*Ap[i]-j*Ap[i]} AP[i]*j是固定的,在队列中维护dp[i-w ...

  8. Parade(单调队列优化dp)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=2490 Parade Time Limit: 4000/2000 MS (Java/Others)    ...

  9. BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP

    BZOJ_3831_[Poi2014]Little Bird_单调队列优化DP Description 有一排n棵树,第i棵树的高度是Di. MHY要从第一棵树到第n棵树去找他的妹子玩. 如果MHY在 ...

随机推荐

  1. python爬虫模块之HTML下载模块

    HTML下载模块 该模块主要是根据提供的url进行下载对应url的网页内容.使用模块requets-HTML,加入重试逻辑以及设定最大重试次数,同时限制访问时间,防止长时间未响应造成程序假死现象. 根 ...

  2. openstack前期准备

    . 两台虚拟机,安装Centos7系统 两个网卡 -- 一个NAT模式,一个仅主机模式 两个硬盘 -- 一个20GB,一个50GB 内存 -- 主 .6GB(根据自己的配置,大于2G即可) 从 1.6 ...

  3. FineReport——JS二次开发(CSS改变控件样式)

    FR提供一些选择器,可以改变部分控件的样式,那么对于如何书写自己的css: 可以自己写css文件导入,也可以在页面加载结束事件中添加JS方法来改变css样式. 以文本框为例: 书写css文件,保存至% ...

  4. js cookies的使用及介绍 (非常详细)

    设置cookie 每个cookie都是一个名/值对,可以把下面这样一个字符串赋值给document.cookie:document.cookie="userId=828";如果要一 ...

  5. 同步方法-java

    除了同步代码块能实现同步执行外,同步方法也可以. 先看下同步代码块实现同步执行: public class Demo4 { public static void main(String[] args) ...

  6. django “如何”系列7:错误汇报

    当你正在运行一个公共的站点的时候,你应该关掉DEBUG设置.这将使你的服务器运行的更快,同时也能预防别有用心的用户从你的错误页面看到你应用的一些详细配置信息.然而,当debug为false的时候,你将 ...

  7. 深入理解python多进程编程

    1.python多进程编程背景 python中的多进程最大的好处就是充分利用多核cpu的资源,不像python中的多线程,受制于GIL的限制,从而只能进行cpu分配,在python的多进程中,适合于所 ...

  8. vue不用webpake等环境及脚手架也可以玩

    初学时,搭环境,es6也来了,vuecil脚手架也弄了,调错,照着教程一遍一遍kei着... 然尔,实际开发中,所写的东西最后是要打包封装成软件的,为了方便其他人修改查看,不能打包成js文件... 难 ...

  9. sublime插件总汇

    本人用过多个编辑器(非IDE),发现sublime的样式非常帮,现在做个插件总汇 ChineseLocalzations      中文插件 Emmet                         ...

  10. JSON APIs and Ajax

    1. 通过jQuery来绑定点击事件. 函数 $(document).ready()这个函数中的代码只会在我们的页面加载时候运行一次,确保执行js之前页面所有的dom已经准备就绪. 在$(docume ...