一題目
給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。
示例:輸入: [10,9,2,5,3,7,101,18]
輸出: 4
解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。
動態規劃:
/**
dp[i]: 所有長度為i+1的遞增子串行中, 最小的那個序列尾數.
由定義知dp陣列必然是乙個遞增陣列, 可以用 maxl 來表示最長遞增子串行的長度.
對陣列進行迭代, 依次判斷每個數num將其插入dp陣列相應的位置:
1. num > dp[maxl], 表示num比所有已知遞增序列的尾數都大, 將num新增入dp
陣列尾部, 並將最長遞增序列長度maxl加1
2. dp[i-1] < num <= dp[i], 只更新相應的dp[i]
**/
def f(nums):
if not nums:
return 0
dp = [nums[0]]
print(dp)
n = len(nums)
for i in range(1, n):
print('i:',i)
if nums[i] > dp[-1]:
print('if dp:',dp)
continue
for j in range(len(dp)):
if nums[i] < dp[j]:
dp[j] = nums[i]
print('for if:',dp)
break
# else:
# nums[i] == dp[j] # 避免相等的數重複入組
# print(nums)
return len(set(dp))
nums=[10,9,2,5,3,7,101,18]
f1=f(nums)
print(f1)
貪心演算法
def f(nums):
size = len(nums)
if size <= 1:
return size
dp = [1] * size
for i in range(1, size):
for j in range(i):
if nums[i] > nums[j]:
# + 1 的位置不要加錯了
dp[i] = max(dp[i], dp[j] + 1)
# 最後要全部走一遍,看最大值
return max(dp)
nums=[10,9,2,5,3,7,101,18]
f1=f(nums)
print(f1)
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...
最長上公升子串行
最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a1動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度,初始時...