ACMCODER-华为笔试题

 最长单调递增子序列:

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))

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值