简介

参考链接 https://space.bilibili.com/24014925/video?keyword=动态规划

example

选择不相邻的数字组成最大的数

import numpy as np
arr = [1, 2, 4, 1, 7, 8, 3]

def rec_opt(arr, i): # 递归方式
    if i == 0:
        return arr[0]
    elif i == 1:
        return max(arr[0], arr[1])
    else:
        A = rec_opt(arr, i - 2) + arr[i] # 选中第i个值
        B = rec_opt(arr, i - 1) # 不选第i个值
        return max(A, B)

def dp_opt(arr): # 非递归方式
    opt = np.zeros(len(arr))
    opt[0] = arr[0]
    opt[1] = max(arr[0], arr[1])
    for i in range(2, len(arr)):
        A = opt[i - 2] + arr[i]
        B = opt[i - 1]
        opt[i] = max(A, B)
    return opt[len(arr) - 1]

print(rec_opt(arr, 6))
print(dp_opt(arr))

example 2

如何查看字符串中选中的任意个数的数字是否可以加起来等于我想要的数字

import numpy as np
arr = [3, 34, 4, 12, 5, 2]

def rec_opt(arr, i, s):
    if s == 0:
        return True
    elif i == 0:
        return arr[0] == s
    elif arr[i] > s:
        return rec_opt(arr, i-1, s)
    else:
        A = rec_opt(arr, i - 1, s - arr[i]) # 选中第i个值
        B = rec_opt(arr, i - 1, s) # 不选第i个值
        return A or B

def dp_opt(arr, s):
    opt = np.zeros((len(arr), s+1) , dtype=bool)
    # print(opt)
    opt[:, 0] = True
    opt[0, :] = False
    opt[0, arr[0]] = True
    for i in range(1, len(arr)):
        for j in range(1, s+1):
            if arr[i] > j:
                opt[i, j] = opt[i-1, j]
            else:
                A = opt[ i - 1, j - arr[i]]
                B = opt[ i - 1, j]
                opt[i, j] = A or B
    r, c = opt.shape
    return opt[r-1, c -1]

print(rec_opt(arr, len(arr) - 1, 6))
print(dp_opt(arr, 13))

Tips

numpy 初始化二维数组

posted on 2020-08-13 22:44  HDU李少帅  阅读(109)  评论(0编辑  收藏  举报