LeetCode1043:Partition Array for Maximum Sum 分隔数组以得到最大和(DP)


在这里插入图片描述

动态规划问题求解的条件:最优解的表示;状态转移方程;边界条件判断。

对于此问题:
1.最优解表示:res[i] 表示 A[0:i]的最优划分对应的值和(res[len(A)]即最终结果);
2.状态转移方程:
r e s [ i ] = r e s [ i − l e n ( l a s t S u b A ) ] + m a x ( l a s t S u b A ) ∗ l e n ( l a s t S u b A ) , 1 < = l e n ( l a s t S u b A ) < = k . res[i]=res[i-len(lastSubA)]+max(lastSubA)*len(lastSubA) ,1<= len(lastSubA) <=k. res[i]=res[ilen(lastSubA)]+max(lastSubA)len(lastSubA)1<=len(lastSubA)<=k.

  • lastSubA表示A[0:i]的最优划分的最后一个子数组

3.边界条件判断:res[i]=max(A[0:i])*i , 1 <= i <= k

编程实现(参考的别人的代码):

# -*- coding: utf-8 -*-
__date__ = '2019/12/29 21:48'


def main(A, k):
    n = len(A)
    dp = [0] * (n+1)

    for i in range(1, n+1):
        j = i-1
        maximum_ele = float('-inf')
        while i-j <= k and j >= 0:
            # 由于不知道lastSubA的大小,因此对lastSubA的所有可能都进行计算,取最大的
            maximum_ele = max(maximum_ele, A[j])
            dp[i] = max(dp[i], dp[j] + maximum_ele*(i-j))
            j -= 1
    # print(dp)
    return dp[-1]


A = [1, 15, 7, 9, 2, 5, 10]
print(main(A, 3))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值