动态规划|python

先上代码:

class Solution:
    def maxLength(self, a):
        if len(a) == 1:
            return 1
        dp = [0]*(len(a)+1)
        dp[0] = 0
        cur_list = a[:1]
        for i in range(1, len(a)):
            progress = self.dp_len(cur_list, a[i])
            dp[i] = max(dp[i-1], progress[0])
            cur_list = progress[1]
        return max(dp)
    # update the situation
    def dp_len(self, temp, ele):
        while ele in temp:
            temp.pop(0)
        temp.append(ele)
        return len(temp), temp

从思路上可以理解为dp【i】与dp【i-1】取max,dp:指当前考虑第i个元素的最大长度与考虑第i-1个元素(不考虑第i个元素)的最长无重复数组
这里设置一个方法def dp_len(temp, ele)用于检测ele是否在temp里,并且更新temp返回更新后的temp和len(temp)用于后续的比较

def dp_len(temp, ele):
    while ele in temp:
        temp.pop(0)
    temp.append(ele)
    return len(temp), temp

Dynamic Programming中的状态更新算法为:

for i in range(1, len(a)):
    progress = dp_len(cur_list, a[i])
    dp[i] = max(dp[i-1], progress[0])
    cur_list = progress[1]

此处还需要在主code block中设置一个if判断,如果输入得len(a)== 1:
则直接返回
return 1