解决leetcode第3826题.最小分割分数问题

3826.最小分割分数

难度:困难

问题描述:

给你一个整数数组nums和一个整数k。

你的任务是将nums分割成恰好k个子数组,并返回所有有效分割方案中最小可能的分数。

一个分割方案的分数是其所有子数组值的总和。

子数组的值定义为sumArr*(sumArr+1)/2,其中sumArr是该子数组元素的总和。

子数组是数组中连续的非空元素序列。

示例1:

输入:nums=[5,1,2,1],k=2

输出:25

解释:

我们必须将数组分割成k=2个子数组。一种最优方案是[5]和[1,2,1]。

第一个子数组的sumArr=5,value=5×6/2=15。

第二个子数组的sumArr=1+2+1=4,value=4×5/2=10。

该分割方案的分数为15+10=25,这是可能的最小分数。

示例2:

输入:nums=[1,2,3,4],k=1

输出:55

解释:

由于必须分割成k=1个子数组,所有元素都属于同一个子数组:[1,2,3,4]。

该子数组的sumArr=1+2+3+4=10,value=10×11/2=55。

该分割方案的分数为55,这是可能的最小分数。

示例3:

输入:nums=[1,1,1],k=3

输出:3

解释:

我们必须将数组分割成k=3个子数组。唯一的有效分割方案是[1],[1],[1]。

每个子数组的sumArr=1,value=1×2/2=1。

该分割方案的分数为1+1+1=3,这是可能的最小分数。

提示:

1<=nums.length<=1000

1<=nums[i]<=104

1<=k<=nums.length

问题分析:

将nums数组分割成恰好k个子数组,则这k个子数组的长度和必然等nums的长度,把数组nums的长度设为n,这个问题就可以抽象为如何把n分成k个数之和,把各种分法找出之后,再将每一种分法解析为相应的子数组,并求出对应的分数,最后在其中找到最小分数即可。

程序如下:

python 复制代码
#把n分成k个数之和,返回各种分法
def get_division_method(n,k):
    if k==1:
        return [[n]]
    elif k==2:
        t=[]
        for i in range(1,n):
            t.append([i,n-i])
        return t
    else:
        t=[]
        for i in range(1,n):
            m=get_division_method(n-i,k-1)
            for j in m:
                j.append(i)
                t.append(j)
        return t

#根据一个分解方案解析生成对应的子数组并返回
def analysis_plan(nums,a):
    t=[]
    k=0
    for i in a:
        b=nums[k:k+i]
        t.append(b)
        k=k+i
    return t

#计算一个子数组的分数,并返回
def get_score(sub_array):
    s=sum(sub_array)
    return s*(s+1)/2

#主程序
nums=eval(input('pls input nums='))
k=int(input('pls input k='))
n=len(nums)
a=get_division_method(n,k)
score=[]
for i in a:
    t=analysis_plan(nums,i)
    s=0
    for j in t:
        s+=get_score(j)
    score.append([t,s])
score.sort(key=lambda x:x[1])
print(f'最优方案是{score[0][0]},该分割方案的分数为{int(score[0][1])}')

运行实例一

pls input nums=[1,2,3]

pls input k=1

最优方案是[[1, 2, 3]],该分割方案的分数为21

运行实例二

pls input nums=[1,2,3,4,5]

pls input k=2

最优方案是[[1, 2, 3], [4, 5]],该分割方案的分数为66

运行实例三

pls input nums=[5,4,2,1]

pls input k=3

最优方案是[[5], [4], [2, 1]],该分割方案的分数为31

运行实例四

pls input nums=[1,3,5,7,9]

pls input k=4

最优方案是[[1, 3], [5], [7], [9]],该分割方案的分数为98

相关推荐
z4424753269 分钟前
CSS Grid布局如何实现网格项目的自动增长_设置grid-auto-flow- row
jvm·数据库·python
GeLx9 分钟前
从反爬角度:Playwright CDP 模式、Playwright 传统模式与 DrissionPage 的比较
python·程序人生·playwright·drissionpage·pyppeteer·浏览器自动化控制
m0_7403524216 分钟前
如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层
jvm·数据库·python
6Hzlia20 分钟前
【Hot 100 刷题计划】 LeetCode 24. 两两交换链表中的节点 | C++ 精准指针舞步
c++·leetcode·链表
隔壁大炮28 分钟前
Day07-RNN介绍
人工智能·pytorch·rnn·深度学习·神经网络·算法·numpy
TechWayfarer34 分钟前
IP归属地运营商能解决什么问题?风控/增长/数据平台落地实践(附API代码)
开发语言·网络·python·网络协议·tcp/ip
雷帝木木35 分钟前
Python 并发编程的高级技巧与性能优化
人工智能·python·深度学习·机器学习
Flittly38 分钟前
【LangGraph新手村系列】(1)LangGraph 入门:StateGraph 与带记忆的 ReAct 循环
python·langchain
第一程序员38 分钟前
2026年GitHub上最值得学习的Python库
python·github
TechWayfarer1 小时前
IP归属地运营商生产落地进阶:缓存+降级+灰度对账全解析
网络·python·网络协议·tcp/ip·缓存