动态规划可以说是比较重要的算法内容了,很多人看懂了概念,但是要用的时候,完全懵逼,就比如我,因此就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