hdu 3401 單調佇列優化動態規劃

2022-05-22 07:00:15 字數 958 閱讀 2829

思路:

動態方程很容易想到dp[i][j]=max(dp[i][j],dp[i-w-1][j-k]-k*ap[i],dp[i-w-1][j+k]+k*bp[i]);

dp[i][j]表示第i天擁有j個石頭的最大價值。

其實每次求得都是最有策略,所有dp[i-w-1]表示的就是i-w-1以前的最優,故不同往前遍歷。

那麼主要需要優化的是:

對於買石頭,容量為j時,維護從j-k到j的轉移最大值。即從哪個容量轉移過來能得到最大效益。

對於賣石頭,容量為j時,維護從j+k到j的轉移最大值。即從哪個容量轉移過來能得到最大效益。

見**:

#include#include

#include

#include

#include

#define inf 10000010

#define maxn 2010

#define min(a,b) (a)>(b)?(b):(a)

using

namespace

std;

int dp[maxn][maxn],as

[maxn],bs[maxn],ap[maxn],bp[maxn];

struct

queque[

10000

];int

main()

head=1,rear=0

;

for(j=p;j>=0;j--)//

賣石頭 }

int max=0

;

for(i=0;i<=p;i++)//

找出最大效益

if(dp[n][i]>max)

max=dp[n][i];

printf(

"%d\n

",max);

}return0;

}

hdu3401 單調佇列優化dp

第乙個單調佇列優化dp 寫了半天,最後初始化搞錯了還一直wa。題目大意 總共 t 天,每天可以 na i 股,賣出nb i 股,價錢分別為pa i 和pb i 最大同時擁有p股 且一次交易後至少要間隔w天才能再次交易,初始有0股,本金無限,求最大收益 題解 dp i j 表示第 i 天,有 j 股的...

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