由leetcode延伸动态规划求解

2 篇文章 0 订阅
1 篇文章 0 订阅

动态规划可以说是比较重要的算法内容了,很多人看懂了概念,但是要用的时候,完全懵逼,就比如我,因此就leetcode 1449 延伸动态规划的求解过程。
题目链接:目标最大值问题
思路:

1、首先根据动态规划问题,填充二维数组,把值都赋为一个特殊字符串,填充可以参考我的上一篇博文
2、判断target是否大于需要的数字成本,并且不等于特殊字符,并在此基础上判断和上一行同位置的大小比较(长度相同的话通过ascll码比较,长度不同直接通过长度比较)
3、填充二维数组,最后一个元素就是我们需要的数据,如果不为空的话。
class Solution:
    def largestNumber(self, cost: List[int], target: int) -> str:
        n = len(cost)
        dp = [[0 for _ in range(target+1)] for _ in range(n+1)]
        for i in range(n+1):
            for j in range(target+1):
                dp[i][j] = '#'
        dp[0][0] = ''

        for i in range(1,n+1):
            for j in range(target+1):
                dp[i][j] = dp[i-1][j]
                if j - cost[i-1] >= 0 and dp[i][j-cost[i-1]]!='#':
                    out = self.compare(dp[i][j], str(i)+dp[i][j-cost[i-1]])
                    if out < 0:
                        dp[i][j] = str(i)+dp[i][j-cost[i-1]]
                        
        return '0' if dp[n][target]=='#' else dp[n][target]


    def compare(self,a,b):
        if len(a) == len(b):
            for i in range(len(a)):
                if a[i]!=b[i]:
                    return ord(a[i]) - ord(b[i])
        else:
            return len(a) - len(b)

输入cost=[4,3,2,5,6,7,2,5,5] ,target=9,可得到dp二维数组如下所示:

[['', '#', '#', '#', '#', '#', '#', '#', '#', '#'], 
['', '#', '#', '#', '1', '#', '#', '#', '11', '#'], 
['', '#', '#', '2', '1', '#', '22', '21', '11', '222'], 
['', '#', '3', '2', '33', '32', '333', '332', '3333', '3332'], 
['', '#', '3', '2', '33', '32', '333', '332', '3333', '3332'],
['', '#', '3', '2', '33', '32', '333', '332', '3333', '3332'], 
['', '#', '3', '2', '33', '32', '333', '332', '3333', '3332'], 
['', '#', '7', '2', '77', '72', '777', '772', '7777', '7772'], 
['', '#', '7', '2', '77', '72', '777', '772', '7777', '7772'], 
['', '#', '7', '2', '77', '72', '777', '772', '7777', '7772']]

因此可得知在代价为9的情况下得到的最大正数是7772

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值