思路:
動態方程很容易想到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動態轉移方程倒是寫對了,然後算算...