中文可以發現資料小些的話是很簡單的 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,當前...