CDOJ 594 我要長高 單調佇列優化DP

2022-08-19 19:15:11 字數 485 閱讀 3057

中文可以發現資料小些的話是很簡單的   dp[i][j](第 i 個人身高為 j 的最小花費)=min(dp[i-1][k]+abs(k-j)*c)+(h[i]-j)^2

由於資料略大,會發現時間複雜度大約是1e9的,由於狀態轉移方程滿足用單調佇列優化的條件,直接用單調佇列優化就行了

(其實只需要用個值記錄下動態的最小值就好了=_=)

#include

#define mmin(a,b) (a=head)--tail;//這一部分也可以改為 s=min(s,dp[1-ch][j]-j*c) 0.0就不需要開佇列了

que[++tail]=dp[1-ch][j]-j*c;//與0的差值

if(j=0;--j)

}int res=dp[ch][h];

for(int i=h+1;i<=100;++i)

if(dp[ch][i]

int main()

UESTC 594 我要長高

我要長高 設 dp i j 表示到第 i 個人,他的身高是 j 的時候的最小損失,然後得到乙個樸素的轉移方程 dp i j min dp i 1 k abs k j c j a i 2 把無關的丟到 min 外面來 dp i j left min dp i 1 k k c j c j a i 2 j...

單調佇列優化dp uestc 594 我要長高

ac 1 include2 using namespace std 3 typedef long long ll 4 const int maxn 5e4 2 5 const int inf 0x3f3f3f3f 6 intn,c 7int cur 8int dp 2 maxn 9int q max...

UESTC 594 我要長高 單調佇列優化DP

給出乙個序列,沒兩個之間差值乘c就是虧損的錢數,可以給一些數列以一定的代價變大,不能減小,求增加方案令最後的損失最小。令dp i j 表示第i個人身高為j時的當前損失。我們能得到dp i j m in d p i 1 k ab s j k c x i j x i j 我們需要列舉的有當前的人i,當前...