UESTC 我要長高 DP優化

2021-09-06 05:46:03 字數 1300 閱讀 7790

韓父有n個兒子,分別是韓一,韓二…韓n。由於韓家演技功底深厚,加上他們間的密切配合,演出獲得了巨大成功,票房甚至高達2000萬。舟子是名很有威望的公知,可是他表面上兩袖清風實則內心陰暗,看到韓家紅紅火火,嫉妒心遂起,便發微薄調侃韓二們站成一列時身高參差不齊。由於舟子的影響力,隨口一句便會造成韓家的巨大損失,具體虧損是這樣計算的,韓一,韓二…韓n站成一排,損失即為c*(韓i與韓i+1的高度差(1<=i有若干組資料,一直處理到檔案結束。

每組資料第一行為兩個整數:韓子數量n(1<=n<=50000)和舟子係數c(1<=c<=100)

接下來n行分別是韓i的高度(1<=hi<=100)。

對每組測試資料用一行輸出韓家的最小損失。

5 2235

14這題算是乙個紅果果的動態規劃題了,但是很明顯普通的做法是乙個o(n^3)的演算法,所以需要對這個動態規劃過程進行單調佇列優化。這裡其實也就保留乙個值就夠了。詳見**:

#include #include 

#include

#include

#define inf 0x3fffffff

#define maxn 50005

using

namespace

std;

int n, m, h[maxn], dp[maxn][105

];//

dp[i][j] 第i個人身高為j時的最少代價

//當前面的身高小於其身高時

//dp[i][j] = min( dp[i-1][k] + mj - mk + (j - h[i])^2 )同理

//對於上面的式子我們只需要維護好上一次狀態的 dp[i-1][k]-mk 的最小值就可以了

//dp[i][j] = min( dp[i-1][k] + mk - mj + (j - h[i])^2 );

//對於上面的式子我們只需要維護好上一次狀態的 dp[i-1][k]+mk 的最小值就可以了

intmain()

for (int i = 0; i <= n; ++i)

for (int i = h[1]; i <= lim; ++i)

for (int i = 2; i <= n; ++i)

}min =inf;

for (int j = lim; j >= h[i]; --j) }}

min =inf;

for (int i = h[n]; i <= lim; ++i)

printf(

"%d\n

", min);

}return

0;

}

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