20230407 动态规划简单示例

这里写目录标题

题目1

题目:给定一个无序数组[1, 5, 2, 4, 3],找出最长的递增子序列[1, 2, 4]或者[1, 2, 3],返回其长度。

思路:L(i)表示第 i 个数 之后的数字中存在的最长子序列的长度(如果本身第 i 个和第 i+1 个不是递增,则置为0)
L(1)=max{L(2)+1, L(3)+1, L(4)+1, L(5)+1}
L(2)=max{L(3)+1, L(4)+1, L(5)+1}
L(3)=max{L(4)+1, L(5)+1}
L(4)=max{L(5)+1}
L(5)=0

说明

  1. 倒着走,先找到最后一个3,所以长度至少是1,获得【x x x x 1】;
  2. 往前看一步,4比3大,获得【x x x 1 1】;
  3. 往前看一步,2比4小,获得【x x 2 1 1】,2比3小,维持【x x 2 1 1】;
  4. 往前看一步,5比2大,比4大,比3大,获得【x 1 2 1 1】;
  5. 往前看一步,1比5小,获得【2 1 2 1 1】,1比2小,获得【3 1 2 1 1】,1比4小,维持【3 1 2 1 1】,1比3小,维持【3 1 2 1 1】;
    结束,得到最长长度为3。

程序

# -*- coding: UTF-8 -*-
def length_of_LIS(nums):
    n=len(nums) # 5
    L=[1] * n # initial value: $[1,1,1,1,1]$

    for i in reversed(range(n)): # i -> 4,3,2,1,0
        for j in range(i+1, n):
            if nums [j]> nums[i]: # is increasing seq
                L[i] = max (L[i], L[j]+1)

    return max(L)

if __name__ == '__main__':
    nums = [1,5,2,4,3]
    length = length_of_LIS(nums)
    print(length)

python在线运行工具
https://c.runoob.com/compile/6/

https://www.bilibili.com/video/BV1AB4y1w7eT?from=search&seid=11115957580604935613&spm_id_from=333.337.0.0

题目2

有无数张卡牌,卡牌面值为2,3,5,找出最小数目的卡牌,其和为24。

f(x)=min{f(x-2)+1,f(x-3)+1,f(x-5)+1};

f(x)是可以拼出x的最少的牌的个数;

边界条件设置为f(x)= + ∞ +\infty +,对于所有 x ≤ − 1 x\leq-1 x1

f(0)=0
f(1)=∞
f(2)=1
f(3)=1
f(4)=2
f(5)=1
f(6)=2
f(7)=2
f(8)=2
f(9)=3
f(10)=2
f(11)=3
f(12)=3
f(13)=3
f(14)=4
f(15)=3
f(16)=4
f(17)=4
f(18)=4
f(19)=5
f(20)=4
f(21)=5
f(22)=5
f(23)=5
f(24)=6

以f(6)为例说明,如果要拼出总数是6,要么用f(4)+1,要么用f(3)+1,要么用f(2)+1

猜你喜欢

转载自blog.csdn.net/weixin_44382195/article/details/130013015
今日推荐