最长单调递增子序列:
import sys
'''
输入:
5, 1, 4, 2, 3
输出:
3
'''
#动态规划-最长单调递增子序列(dp)
'''
解法1(n^2)
状态:d[i] = 长度为i+1的递增子序列的长度
状态转移方程:dp[i] = max(dp[j]+1, dp[i]);
分析:最开始把dp数组初始化为1,
然后从前往后考虑数列的元素,对于每个aj,如果a[i] > a[j],
就用dp[i] = max(dp[i], dp[j] + 1)进行更新,再从dp数组中找出最大值即为结果。
'''
def length_count(s):
if not s:
return 0
dp = [1]*len(s)
# print(dp)#[1, 1, 1, 1, 1]
ans = 1
for i in range(1,len(s)):
for j in range(i): # 5, 1, 4, 2, 3
# print('s[i]',s[i]) #s[i] 1 4 4 2 2 2 3 3 3 3
# print('s[j]',s[j]) #s[j] 5 5 1 5 1 4 5 1 4 2
# print('dp[i]', dp[i]) #dp[i] 1 1 1 1 1 2 1 1 2 2
# print('dp[j]',dp[j]) #dp[j] 1 1 1 1 1 2 1 1 2 2
if s[i]>s[j] and dp[i] <dp[j] +1:
# print('i',i) #i 2 3 4 4
# print('j',j) #j 1 1 1 3
dp[i] = dp[j]+1
# print(dp[i]) #dp[i] 2 2 2 3
ans = max(ans,dp[i])
# print('ans',ans) #ans 1 ans 2 ans 2 ans 3
return ans
if __name__ == "__main__":
# 读取第一行的
s = sys.stdin.readline().strip()
s1 = s.split(',')
s2=[]
for i in s1:
s2.append(int(i))
# print(s2) #[5, 1, 4, 2, 3]
print(length_count(s2))