你有 k 个背包。给你一个下标从 0 开始的整数数组 weights ,其中 weights[i] 是第 i 个珠子的重量。同时给你整数 k 。

请你按照如下规则将所有的珠子放进 k 个背包。

  • 没有背包是空的。
  • 如果第 i 个珠子和第 j 个珠子在同一个背包里,那么下标在 i 到 j 之间的所有珠子都必须在这同一个背包中。
  • 如果一个背包有下标从 i 到 j 的所有珠子,那么这个背包的价格是 weights[i] + weights[j] 。

一个珠子分配方案的 分数 是所有 k 个背包的价格之和。

请你返回所有分配方案中,最大分数 与 最小分数 的 差值 为多少。


建模:n个数,有n-1个缝,选k-1个缝,分割数组

两头的数肯定要加上的所以最大方案和最小方案都包含,差值就忽略两头的数了,就看缝的选择。

每选择一个缝,意味着和要加上缝两边的数字,创建以恶搞缝隙数组a,a[i]=weights[i]+weights[i+1]

最大方案就是去最大的k-1个,最小方案就是取最小的k-1个,然后相减。

k==1或者k==n时只有一种方案,相减结果是0,当然也是被通用逻辑兼容的,也可以不做特殊判断

/**
 * @param {number[]} weights
 * @param {number} k
 * @return {number}
 */
var putMarbles = function(weights, k) {
    if(k==1||k==weights.length)
        return 0;
    let a=new Array(weights.length-1);
    for(let i=0;i<a.length;i++)
        a[i]=weights[i]+weights[i+1];
    a.sort((a,b)=>a-b);
    let sum1=0,sum2=0;
    for(let i=0;i<k-1;i++){
        sum1+=a[i];
        sum2+=a[a.length-1-i];
    }
    return sum2-sum1;
};