题解 | #合唱队#

合唱队

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

我认为大家都用的动态规划方法,时间上面确实有些长,如果用Python这些语言可能就会超时,我想了一下有一个方法可以节省时间。

如题示例: 186 186 150 200 160 130 198 200

对应的dp值 1 1 1 2 2 1 3 4

其实不需要一个一个去比较 dp[i] 和 dp[j] ,例如对于198,她是不需要与186 186 150 去比较的,因为他们dp值为不是在186 186 150 200 160 130 中最大的,最大的dp值对应200 160 ,意思就是,做比较的时候,依次和dp值最大的数去比较大小就可以了

所以198 和200 160 去比较。 而130则先与200 160 比较,再和186 186 150比较(即与 比最大dp值次一级的数 去比较,如果依然小于这些数,那就再与 比上个dp值次一级的数 去比较)

即使用字典给数赋对应的dp值,然后按dp值大的依次比较 又或者直接按dp值把原来的list分为若干小list,比如dp1 = [186,186,150] dp2 = [200,169] ...

总之就是减少让元素与前面元素挨个比较的机会,只和大的dp对应的元素比较,依次去比较。

可以用dict或者小list 进行分类来实现,代码还没写,先跟大家讨论一下思路,如果不行,欢迎大家给我建议哈。后面我再更新代码实现。。。

全部评论
https://blog.nowcoder.net/n/e851143b9af346aba43f0c9f0d53f09b 可以的 我实现了 维护一个虚拟递增序列每个值为达到该长度的门槛值
点赞 回复 分享
发布于 2024-02-23 21:00 江苏
不行的,你这因果互换了啊
点赞 回复 分享
发布于 2023-10-02 11:54 重庆
思路是很好的!🤭🤭🤭🤭
点赞 回复 分享
发布于 2022-07-03 16:32
你这思路不正确,照着你这思路,dp[i]要么为初始值,要么为max(dp[j] for j in range(i))+1。而实际上,当j
点赞 回复 分享
发布于 2022-04-23 14:12

相关推荐

双尔:你就写拥有ai开发经历,熟练运用提示词,优化ai,提高ai回答质量
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务