tj
2025-10-08 20:30:22
发布于:浙江
1阅读
0回复
0点赞
def solve():
import sys
input = sys.stdin.read().split()
idx = 0
m = int(input[idx])
idx += 1
for _ in range(m):
n = int(input[idx])
idx += 1
heights = list(map(int, input[idx:idx+n]))
idx += n
# dp_length[i]表示以第i个木桩结尾的最长非降序子序列长度
dp_length = [1] * n
# dp_count[i]表示以第i个木桩结尾的最长非降序子序列的方案数
dp_count = [1] * n
for i in range(n):
for j in range(i):
if heights[j] <= heights[i]:
# 发现更长的子序列
if dp_length[j] + 1 > dp_length[i]:
dp_length[i] = dp_length[j] + 1
dp_count[i] = dp_count[j]
# 发现长度相同的子序列,累加方案数
elif dp_length[j] + 1 == dp_length[i]:
dp_count[i] += dp_count[j]
# 找到最长子序列的长度
max_length = max(dp_length)
# 计算总方案数
total_count = sum(dp_count[i] for i in range(n) if dp_length[i] == max_length)
print(max_length, total_count)
if __name__ == "__main__":
solve()
这里空空如也






有帮助,赞一个