HDU 3905 Sleeping 單調優化DP)

2022-04-06 17:13:58 字數 816 閱讀 3351

題目鏈結

這個狀態轉移想了會時間,dp[i][j]記錄前i分鐘學了j分鐘的取得的最大的分數,得到方程dp[i][j] = dp[i-k][j-k] + sum[i] - sum[i-k](l<=k<=j) ,這個果斷並不是只是乙個普通的dp,交上各種tle,然後發現問題了,應該需要需要優化。這個狀態方程神似以前單調佇列優化dp的轉移方程,只不過改成對角線了,而且只需維護佇列的隊頭即可。對這部分還是不太自信啊,試著寫了寫,反正感覺寫的不太好,wa了多次,亂改了幾次後過了。。。不容易啊。

1 #include 2 #include 3 #include 4

using

namespace

std;

5int dp[1001][1001],p[1001],sum[1001],que[1001];6

intmain()718

for(i = 1;i <= n;i ++)//初始化佇列

19 que[i] =i;

20for(i = l;i <= n;i ++)

2129

if(dp[i][j] < dp[que[i-j+1]][que[i-j+1]+j-i]+sum[i]-sum[que[i-j+1

]])30 dp[i][j] = dp[que[i-j+1]][que[i-j+1]+j-i]+sum[i]-sum[que[i-j+1

]];31}32

}33 printf("

%d\n

",dp[n][n-m]);34}

35return0;

36 }

D 訓練技巧(dp,單調佇列優化)

有n天,每天訓練收益為ei,如果連續訓練了k天,則必須休息一天,問訓練的最大收益,1 n,k 1e5 dp i 表示第i天不訓練,前i天的最小損失,dp i min dp i dp j a i j i 1 i 2 i k 1 答案就是第n 1天不訓練,sum 前n天的最小損失嘍 這樣還是會超時,需要...

hdu 4374 dp 單調佇列優化

解法 dp 單調佇列!有乙個的樓房,從第一層某個位置出發上樓,每次能爬上一層樓也可以在同一層左右移動,但是在每一層的移動距離不能超過某個值。現在每個位置都有乙個數值,求從第一層出發到最後一層經過的路徑上最多能取到的最大價值。dp i j 表示 第i行,第j個數字的最大價值!sum i j 表示 第i...

hdu 3530 dp 單調佇列優化

題目 題意 給你乙個長度為n的數列,要求乙個子區間,使得區間的最大值與最小值的差s滿足,m s k,求滿足條件的最長子區間 分析 做了前面幾題後,這題容易想到用兩個單調佇列維護當前最值,作為判斷條件,如果差值大於k了,就去掉較前面的那個佇列元素,並把區間頭更新為它的標號 1,這裡注意差值小於m並不需...