我要長高
設\(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個兒子原本的身高 我們分...