迎春舞會之三人組舞 版本2 題解

2021-10-25 18:43:58 字數 2035 閱讀 6039

題目描述

hnsdfz的同學們為了慶祝春節,準備排練一場舞 n個人選出3×m

3\times m

3×m人,排成m組,每組3人。 站的隊形——較矮的2個人站兩側,最高的站中間。 從對稱學角度來欣賞,左右兩個人的身高越接近,則這一組的「殘疾程度」越低。 計算公式為 h=(

a−b)

2h=(a-b)^2

h=(a−b

)2(a、b為較矮的2人的身高) 那麼問題來了。 現在候選人有n個人,要從他們當中選出3×m

3\times m

3×m個人排舞蹈,要求總體的「殘疾程度」最低。

輸入格式

第一排為m,n。 第二排n個數字,保證公升序排列。 m<=1000,n<=5000 資料保證3*m<=n

輸出格式

輸出最小「殘疾程度」。

輸入樣例

9401

8101619

2227

3336

4047

5256

6163

7172

7581

8184

8896

98103

110113

118124

128129

134134

139148

157157

160162

164

輸出樣例

23
這道題有乙個小細節:保證公升序排列,這說明了我們選的人必須是相鄰的,因為如果選擇i

ii和i+2

i+2i+

2的殘疾程度一定沒有選擇i

ii和i+1

i+1i+

1的殘疾程度小,i

ii和i−2

i-2i−

2同理。

我們只需要選一組人的其中兩個,另外乙個人選乙個大的就行了

但是如果正著做會遇到麻煩,但也能做,這裡就以從後往前來做為例

設d p[

i][j

]dp[i][j]

dp[i][

j]表示考慮後i

ii個人,選中了j

jj組,最小的殘疾程度

則d p[

i][j

]=mi

n(dp

[i+1

][j]

,dp[

i+2]

[j−1

]+(a

[i+1

]−a[

i])×

(a[i

+1]−

a[i]

))

dp[i][j]=min(dp[i+1][j], dp[i+2][j-1]+(a[i+1]-a[i])\times (a[i+1]-a[i]))

dp[i][

j]=m

in(d

p[i+

1][j

],dp

[i+2

][j−

1]+(

a[i+

1]−a

[i])

×(a[

i+1]

−a[i

]))

#include

using

namespace std;

#define maxn 5005

#define inf 0x3f3f3f3f

int n, m;

int a[maxn]

, dp[25]

[maxn]

;int

main()

printf

("%d\n"

, dp[1]

[m])

;return0;

}

re的童鞋們加一下滾動陣列就行了

完結撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。

迎春舞會之三人組舞 dp

題目鏈結 初看此題,難免想起這道題目 但仔細想想,發現中間那個人的標記會很難搞 於是便有了如下思路 dp i j 表示在前i個人中分成j組的最小殘疾程度便有如下狀態轉移方程 dp i j min dp i 1 j dp i 2 j 1 num i num i 1 2 但有以下要點 當i 1 j 3時...

演算法3(low B三人組)

首先,列表每兩個相鄰的數,如果前邊的比後邊的大,那麼交換這兩個數 時間複雜度 o n2 def bubble sort lis 氣泡排序 param lis 無序列表 return 有序的從小到大的列表 for i in range 0,len lis 1 可能存在列表已經排好的情況,加標記 exc...

排序演算法之low B三人組

列表排序 將無序列表變成有充列表 應用場景 各種榜單,各種 給二分法排序使用,給其他演算法使用 輸入無序列表,輸出有序列表 公升序或降序 排序low b三人組 首先,列表每兩個相鄰的數做比較,如果前邊的數比後邊的數大,那麼交換這兩個數 def bubble sort l1 for i in rang...