HDU3401 Trade 單調佇列優化dp

2022-06-02 09:06:08 字數 1254 閱讀 5246

分析可以設定二維的dp狀態i天有j塊錢的最大收益

對w+1天之前的每天進行初始化,因為在這個時候只能買,也可以不買,但是這個不買在後面進行集體操作

之後就有3種情況,一種是買,一種是不操作,一種賣出

並且只有當滿足條件的時候才能進行買賣,那麼這個優化方法就明顯了,不買的情況就是等於前一天這個錢的大小在滿足條件的情況下找到收益最大的地方轉移

而這裡只需要用i-w-1進行轉移就行了,為什麼呢?

因為題目雖然說我們可以相隔w天以上都行,但是其實我們在進行單調佇列操作的時候已經做了重要的一步,也就是f[i][j]=f[i-1][j]和fij的最大值,這也就說明相隔w+1天以上的值都已經通過這個操作轉移過來了,也就是說如果在w+2天操作更好,那麼這個值就會通過w+1天不操作轉移過了,所以我們就可以直接操作i-w-1,因為這樣如果w+2更優,其實就在對w+2天進行操作。

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;const

int n=5e5+10

;const

int inf=0x3f3f3f3f

;const

int mod=1e9+7

;int

a[n],b[n],c[n],d[n];

intq[n];

int f[2200][2200

];int

main()

int hh=0

;

int tt=-1

; memset(f,-0x3f,sizeof

f); f[

0][0]=0

;

intj;

for(i=1;i<=w+1;i++)

for(i=1;i<=n;i++)

hh=0

; tt=-1

;

for(j=maxp;j>=0;j--)

}int res=-0x3f3f3f3f

;

for(i=0;i<=maxp;i++)

cout}}

view code

HDU 3401 Trade 單調佇列優化

題意 第i天 一股的價錢api,賣出一股的價錢bpi,最多 asi股,最多賣出bsi股。兩次操作 或賣出 中間必須相差w天。時間為n。任意時間手中的 不大於maxp。求最大收益。dp i j 代表第i天手上有j股的最大收益,dp i j max dp i 1 j dp i w k j k ap i ...

HDU 3401 Trade 單調佇列優化dp

題目大意 現在要你去 給你每天的開盤價值,每股 價值為ap,賣出價值為bp,每天最多買as股,最多賣出bs股,並且要求兩次買賣必須間隔w天,問你在t天內如何進行 操作從而獲得最大收益。解題思路 先吐槽一下,會單調佇列但不會dp不行,會dp但不會單調佇列也不行!開始dp動態轉移方程倒是寫對了,然後算算...

hdu 3401 Trade 單調佇列優化dp

題意 lxhgww喜歡 票,他可以在第i天 或者賣出若干張 一天只能買或者賣 兩個交易日之間至少相隔w天,問他t天後最多能賺多少。解題思路 首先我們可以得出的dp狀態是,dp i j 表示第i天有j張 最多能持有多少錢,初始值dp 0 0 0 其餘都為 inf。那麼我們可以得到乙個時間複雜度為o t...