动态规划python

动态规划是一种解决复杂问题的方法,通过分解为子问题进行求解。核心思想是将问题逐步拆解,利用万能公式dp[i] = f(dp[j])进行状态转移,并设定base case。例如,在给定数列中选择元素以达到最大和或满足特定条件的和,相邻元素不可取等约束。
摘要由CSDN通过智能技术生成

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。


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值