题解 | #合唱队#

合唱队

https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

这个思路就是对每一个位置上的元素先找它左边的增序列,再找它右边的减序列,同时记录下最长的长度,最后用总人数减去最大的人数就可以了。

这段代码是正确可运行的,就是复杂度太高了,我用自己的编辑器可以得到所有正确答案,就是超时,一点优化的思路是压缩循环,直接遍历全元素的dp增序列和减序列

n = int(input())
talls = list(map(int, input().split()))


if n < 3:
    print(0)
else:
    members = 0
    for i in range(1, n - 1):
        dpl = [0] * (i + 1)
        for il in range(1, i + 1):
            for j in range(0, il):
                if talls[il] > talls[j]:
                    dpl[il] = max(dpl[il], dpl[j] + 1)
        dpr = [0] * n
        for ir in range(n - 2, i - 1, -1):
            for k in range(n - 1, ir, -1):
                if talls[ir] > talls[k]:
                    dpr[ir] = max(dpr[ir], dpr[k] + 1)

        if dpl[i] != 0 and dpr[i] != 0:
            members = max(dpl[i] + dpr[i] + 1, members)
    print(n - members)
全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
11-01 08:48
门头沟学院 C++
伤心的候选人在吵架:佬你不要的,能不能拿户口本证明过户给我。。球球了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务