小白笔记------------------最小m段和问题

本文探讨了如何使用动态规划解决最小m段和问题。通过分析将数列分成不同段的情况,建立了状态转移方程:f[i][j] = min(max(f[i][1]-f[k][1],f[k][j-1])),表示i个数分成j段的最小最大字段和。并提供了一个C语言实现的测试案例。" 112681499,10536763,WordPress网站底部悬浮客服菜单配置教程,"['底部菜单', 'WordPress', '网站美化', 'HTML/CSS', '客服功能']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看动态规划法,对状态转移方程总是写不出来例如今天这个问题:
这个问题怎么才能抽象出状态转移方程呢?
我们考虑将5个数分成3段的情形,首先考虑分成1段的时候,一个数只能分成1个段,则f[1][1] = a[1],如果是两个数呢,两个数可以分成1段则,f[2][1] = a[1] + a[2],由此易得对于i个数,f[i][1] = a[1] + a[2] + ...+a[i]。接着考虑分成2段的时候,对于一个数无法分成两段,则f[1][2] = 0,如果是两个数,则易知,f[2][1] = a[1],f[2][2] = a[2],或者是另外一种情况只有两种可能,看到这里也许还不太明显,如果是三个数,分成两段,则必定有一个段数是分成一段,一个数单独一段,如果是四个数,同样的,则必定有一段数分成一段,一段或者一个数分成一段,从这里就容易发现,不论怎么分,它总是一个在剩下数中分成1段和j-1段的过程,而我们需要做的就是将这个抽象成状态转移方程,到这里应该可以了。

f[i][j] = min(max(f[i][1]-f[k][1],f[k][j-1]));这是最小m段和的状态方程,f[i][j]表示i个数分成j个子段的最小最大字段和,式子表示的意思是前k个数分成j-i个段,后k个数分成一段,因为k是循环的则能取到i个数分成j段的最大和,然后再从最大和中取最小值。

用c写的小测试
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值