UESTC 594 我要長高

2021-09-27 02:11:05 字數 991 閱讀 4655

我要長高

設\(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 < k) \\ min(dp[i - 1][k] - k * c) + j * c + (j - a[i]) ^ 2 (j > k)\\ \end \right. \]

直接列舉\(i,j,k\)顯然是\(o(n^3)\)的,看到有\(min / max\)考慮怎麼單調佇列一下

然後發現好像不用單調佇列也可以,我們只需要儲存當前\(min\)裡面那一坨的最小值就可以了

#include#define inf (1000000000 + 7)

#define n (50000 + 10)

using namespace std;

inline int read()

while (isdigit(c))

return cnt * f;

}int n, c, a[n], dp[n][105];

int gmin, lim, ans;

inline int pow(int x)

int main()

gmin = inf;

for (register int j = lim; j >= a[i]; --j)

}ans = inf;

for (register int i = a[n]; i <= lim; ++i) ans = min(ans, dp[n][i]);

printf("%d\n", ans);

}return 0;

}

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,當前...

UESTC 我要長高

題意是 就是題目描述的那樣了吧 題意很顯而易見,一眼dp題 dp i j 代表第i個人身高為j時的最小消耗,dp i j min dp i 1 k abs j k c j h i 2 複雜度o n h i 2 很明顯有點大,學習了一下單調佇列優化dp之後,發現形如dp i min max dp j ...

UESTC 1685 我要長高

單調佇列優化dp。借鑑 首先建立方程,很容易想到的是,dp i j 表示第 i 個兒子身高為 j 的最低花費。分析題目很容易知道,當前兒子的身高花費只由前乙個兒子影響。因此,dp i j min dp i 1 k abs j k c x i j x i j 其中x i 是第i個兒子原本的身高 我們分...