这是经典的环形区间动态规划(石子合并)。
线性情形:设 dp[i][j] 为把下标 i..j 合并成一盘的最小代价,sum(i,j) 为该区间份量之和,则
dp[i][j]=mini≤k<j(dp[i][k]+dp[k+1][j])+sum(i,j)
边界 dp[i][i]=0。
年夜饭的圆桌上摆了 n 盘凉菜(n 至少为 2),按顺时针编号为 0..n−1,第 i 盘的份量为 weights[i]。菜盘围成一圈:0 号与 n−1 号相邻。
每次操作必须选当前相邻的两盘凉菜合并成一盘:
不断合并,直到桌上只剩一盘凉菜。请计算:完成合并的最小总代价。
请实现:
minCircleMerge(weights: int[]) -> long
一行整型数组,形如 [1,1,1]。
约束:
一行整数:最小总代价。
输入:
[1, 1, 1]
输出:
5
说明:
输入:
[1, 2, 3, 4]
输出:
19
说明:
输入:
[10, 20]
输出:
30
说明:只剩两盘时只能合并一次,代价为 10+20=30。
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册