zoukankan      html  css  js  c++  java
  • 最最最牛逼的算法:动态规划

    1.寻找不相邻元素的最大和

    <递归版本>

     1 def recv_opt(array, i):
     2     """
     3     这里面的递归出口是0/1
     4     递归关系是
     5     max(recv_dp(array, i - 2) + array[i],
     6         recv_dp(array, i - 1))
     7     :param array: 数组
     8     :param i: 里面长度
     9     :return: 最大值
    10     """
    11     if i == 0:
    12         return array[0]
    13     elif i == 1:
    14         return max(array[0], array[1])
    15     else:
    16         A = recv_opt(array, i - 2) + array[i]
    17         B = recv_opt(array, i - 1)
    18         return max(A, B)
    19 
    20 
    21 array = [1, 2, 4, 1, 7, 8, 3]
    22 print(recv_opt(array, len(array) - 1))
    View Code

     <动态规划版本>

     1 import numpy as np
     2 arr = [1,2,4,1,7,8,3]
     3 # arr = [4,1,1,9,1]
     4 def dp(arr):
     5     opt = np.zeros(len(arr))
     6     opt[0]=arr[0]
     7     opt[1]=max(arr[0],arr[1])
     8     for i in range(2,len(arr)):
     9         A = opt[i-2]+arr[i]
    10         B = opt[i-1]
    11         opt[i] = max(A,B)
    12     return opt[len(arr)-1]
    13 print(dp(arr))
    14 """
    15 15.0
    16 """
    View Code

     2.最大连续子序列和

    思路:对于arr[i],要么为单独为max,要么前面开始的某一段到arr[i].

    转移方程为:
    dp[i] = max{arr[i],dp[i-1]+A[i]}
    出口为:
    dp[0] = arr[0]
     1 # 最大连续子序列和
     2 def max_sum(arr):
     3     dp = []
     4     dp.append(arr[0])
     5     for i in range(1, len(arr)):
     6         dp.append(max(arr[i], dp[i - 1] + arr[i]))
     7     return dp
     8 
     9 
    10 arr = [-2, 11, -4, 13, -5, -2]
    11 print(max_sum(arr))
    View Code

     3.最长公共子序列

    思路:。。。

     1 import numpy as np
     2 
     3 
     4 def LCS(str1, str2):
     5     dp = np.zeros((len(str1) + 1, len(str2) + 1))
     6     for i in range(1, len(str1) + 1):
     7         for j in range(1, len(str2) + 1):
     8             if str1[i - 1] == str2[j - 1]:
     9                 dp[i][j] = dp[i - 1][j - 1] + 1
    10             else:
    11                 dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
    12     return dp
    13 
    14 
    15 print(LCS("abcbdab", "bdcaba"))
    16 """
    17 [[0. 0. 0. 0. 0. 0. 0.]
    18  [0. 0. 0. 0. 1. 1. 1.]
    19  [0. 1. 1. 1. 1. 2. 2.]
    20  [0. 1. 1. 2. 2. 2. 2.]
    21  [0. 1. 1. 2. 2. 3. 3.]
    22  [0. 1. 2. 2. 2. 3. 3.]
    23  [0. 1. 2. 2. 3. 3. 4.]
    24  [0. 1. 2. 2. 3. 4. 4.]]
    25 """
    View Code
  • 相关阅读:
    IdentityServer4 接口说明
    MQTT中的Retained(保留消息) 与 LWT(最后遗嘱)
    Docker常用命令
    开源服务容错处理库Polly使用文档
    MQTT 主题的高级特性
    MQTT的$SYS主题定义
    RabbitMQ消息队列之Windows下安装和部署
    RabbitMQ多台物理机集群搭建
    Ocelot.json完整配置文件
    nginx.conf文件配置明细详解
  • 原文地址:https://www.cnblogs.com/d9e84208/p/10703483.html
Copyright © 2011-2022 走看看