题目:
题解:
先举例说明:
按照动态规划的步骤:明确 base case -> 明确「状态」-> 明确「选择」 -> 定义 dp 数组/函数的含义,来确定每一个步骤
- 明确 base case:
dp[i]
初始值为 1,因为以nums[i]
结尾的最长递增子序列起码要包含它自己 - 明确状态:
- 明确选择:
- dp的定义:
dp[i]
表示以nums[i]
这个数结尾的最长递增子序列的长度
则伪代码如举例中所示
代码:
def lengthOfLIS(arr):
dp = [1] * len(arr)
max_num = 1
for i in range(0, len(dp)):
for j in range(0, i):
if arr[i] > arr[j]:
dp[i] = max(dp[i], dp[j] + 1)
if dp[i] > max_num:
max_num = dp[i]
return max_num
if __name__ == '__main__':
arr = [2, 1, 5, 3, 6, 4, 8, 9, 7]
result = lengthOfLIS(arr)
print(result)