OpenJudge - 01065:Wooden Sticks
这道题其实就是要求对 排序后
的最长递减序列,据说用Dilworth's theorem不难证明(可是我不会……)
事实上,求最长递减序列也是有讲究的,如果使用单调栈,会快很多。
放两种代码,都能过,但时间有差异:
动态规划:
for _ in range(int(input())):
n = int(input())
lst = list(map(int, input().split()))
sticks = [[lst[2*k], lst[2*k+1]] for k in range(n)]
sticks.sort(key=lambda x: (x[0], x[1]))
weights = [stick[1] for stick in sticks]
dp = [1 for _ in range(n)]
for i in range(n):
for j in range(i):
if weights[j] > weights[i]:
dp[i] = max(dp[i], dp[j]+1)
print(max(dp))
单调栈:
import bisect
for _ in range(int(input())):
n = int(input())
lst = list(map(int, input().split()))
sticks = [[lst[2*k], lst[2*k+1]] for k in range(n)]
sticks.sort(key=lambda x: (x[0], x[1]))
weights = [stick[1] for stick in sticks][::-1]
stack = []
for j in range(n):
idx = bisect.bisect_left(stack, weights[j])
if idx == len(stack):
stack.append(weights[j])
else:
stack[idx] = weights[j]
print(len(stack))