题目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
说明
- 倒着走,先找到最后一个3,所以长度至少是1,获得【x x x x 1】;
- 往前看一步,4比3大,获得【x x x 1 1】;
- 往前看一步,2比4小,获得【x x 2 1 1】,2比3小,维持【x x 2 1 1】;
- 往前看一步,5比2大,比4大,比3大,获得【x 1 2 1 1】;
- 往前看一步,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/
题目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 x≤−1;
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