动态规划python

1.定义

动态规划(英语:Dynamic planning,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。

2.核心思想

把一个复杂问题不断拆分为子问题,逐个来解决。

万能公式:

  1. dp[i],dp[i][j]表示的含义;
  2. dp转换状态:dp[i] = f(dp[j])
  3. base case,即出口

3.例子

对于数列arr = [1,2,4,1,7,8,3],如何选择才能使得到的值最大,限制:相邻元素不可取。

import numpy as np
arr = [1,2,4,1,7,8,3]
def dp_opt(arr):
  opt = np.zeros(len(arr)) #用0占位
  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(dp_opt(arr))

对于数列arr = [3,34,4,12,5,2],取出几个数字,使得相加为9。

arr = [3,34,4,12,5,2]
def rec_subset(arr,i,s):
    if s == 0:
        return True
    elif i == 0:
        return arr[0] == s
    elif arr[i] > s:
        return rec_subset(arr,i-1,s)
    else:
        A = rec_subset(arr,i-1,s-arr[i])
        B = rec_subset(arr,i-1,s)
        return A or B
print(rec_subset(arr,len(arr)-1,9))
import numpy as np
arr = [3,34,4,12,5,2]
def dp_subset(arr,S):
    subset = np.zeros((len(arr),S+1),dtype=bool)
    subset[:,0] = True
    subset[0,:] = False
    subset[0,arr[0]] = True
    for i in range(1,len(arr)):
        for s in range(1,S+1):
            if arr[i] > s:
                subset[i,s] = subset[i-1,s]
            else:
                A = subset[i-1, s-arr[i]]
                B = subset[i-1,s]
                subset[i,s] = A or B
    r,c = subset.shape
    return subset[r-1,c-1]
print(dp_subset(arr,9))

你可能感兴趣的:(动态规划,算法)