第二题,考完才写出来,不知道对不对,我想的是用两个数组dp1[i]表示以第i个数字结尾且第一个数字最大的子序列个数,然后从右往左再来个dp2。那么最大值为i的子序列个数为2*(dp1[i] + dp2[i]),就是当前往左的序列个数dp1[i]加上当前往右的序列个数dp2[i],然后左边的所有数字组成的序列可逐个往右扩展dp2[i]个,右边往左扩展dp1[i]个,两者重复一个,但是少算了一个数字本身,所以抵消了。但是当其中一个为0的时候,则只保留另一个数组的值+1(数字本身)。 dp1 = [0]*n dp2 = [0]*n for i in range(1, n): if nums[i]>nums[i-1]: dp1[i] = dp1[i-1]+1 for i in range(n-2, -1, -1): if nums[i]>nums[i+1]: dp2[i] = dp2[i+1] + 1 sums = sum(range(n+1)) res = 0 for i in range(len(dp1)): if dp1[i] == 0 or dp2[i] == 0: res += (nums[i] * (dp1[i] + dp2[i] + 1)) / sums else: res += (nums[i]*(2*(dp1[i] + dp2[i])))/sums print(round(res, 6))
点赞 评论

相关推荐

03-11 21:46
西北大学 Java
河和静子:这只是实习工资,我学长北大通班博一的,他同学被这家天天发邮件让他去实习,一个月10w
点赞 评论 收藏
分享
牛客网
牛客企业服务