输入包含多组测试数据。第一行包含整数
表示测试组数。每组数据描述如下:
第一行包含一个整数
;
第二行包含
个整数,表示数组
。
保证所有测试中
的总和不超过
。
对于每组测试数据,输出一行一个整数,表示将数组划分为若干非空连续子数组后,权值之和的最小值。
3 5 1 1 2 2 3 3 5 5 5 4 1 2 3 4
8 15 10
样例一:一种最优划分为
,权值分别为
,总和
。
样例二:任意划分总和均为
。
样例三:将其划分为单点
,总和
。
def minCost(seq):
n = len(seq)
valSet = set(seq)
valDict = {val: i for i, val in enumerate(valSet)}
m = len(valSet)
INF = 10**19
dp = [INF] * (n + 1)
dp[0] = 0
for i in range(1, n + 1):
freqArr = [0] * m
bestVal = weight = 0
for j in range(i - 1, -1, -1):
val = seq[j]
idx = valDict[val]
freq = freqArr[idx] + 1
freqArr[idx] = freq
if freq > weight&nbs***bsp;(freq == weight and val > bestVal):
bestVal, weight = val, freq
cost = bestVal * (i - j)
dp[i] = min(dp[i], dp[j] + cost)
return dp[n]