第二题,考完才写出来,不知道对不对,我想的是用两个数组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&nbs***bsp;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))