題目描述
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...