hdu 3401 Trade 單調佇列優化dp

2022-09-23 08:27:12 字數 1165 閱讀 5291

題意:lxhgww喜歡**票,他可以在第i天**或者賣出若干張**(一天只能買或者賣),兩個交易日之間至少相隔w天,問他t天後最多能賺多少。

解題思路:首先我們可以得出的dp狀態是,dp[i][j]表示第i天有j張**,最多能持有多少錢,初始值dp[0][0] = 0 , 其餘都為-inf。那麼我們可以得到乙個時間複雜度為o(t*mxp*交易上限)的暴力轉移方程,這樣還是會超時。找單調性,對於****(賣出跟**差不多的),設上一次能轉移過來的交易日為k( if ( i <= w )  k = 0 ; else k =i-w-1 ;),而j張**的最優值是從i推過來的,那麼j+1的最優值至少是從i推過來的,這個性質我是這樣推出來的:

若dp[k][i] - (j-i) * x (x表示當天的**單價)>dp[k][i-1] - (j-(i-1)) *x,則dp[k][i] - (j+1-i) * x > dp[k][i-1] - (j+1-(i-1)) * x。這樣就有單調性了,那麼就可以用單調佇列優化了。  

#include

#include

#include

using namespace std ;

const int inf = -10000000 ;

const int maxn = 2222 ;

int w , t , mxp ;

struct deque

int empty ()

void push ( int id , int v )

int get ( int p , int k , int flag )

else

} } q ;

int dp[maxn][maxn] ;

int a[maxn] , b[maxn] , c[maxn] , d[maxn] ;

int main ()

q.init () ;

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

} int ans = 0 ;

for ( i = 0 ; i <= mxp ; i ++ ) ans = max ( ans , dp[t][i] ) ;

printf ( "%d\n" , ans ) ;

} return 0 ;

}

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動態轉移方程倒是寫對了,然後算算...

HDU3401 Trade 單調佇列優化dp

分析可以設定二維的dp狀態i天有j塊錢的最大收益 對w 1天之前的每天進行初始化,因為在這個時候只能買,也可以不買,但是這個不買在後面進行集體操作 之後就有3種情況,一種是買,一種是不操作,一種賣出 並且只有當滿足條件的時候才能進行買賣,那麼這個優化方法就明顯了,不買的情況就是等於前一天這個錢的大小...