def preceding_larger(A: list[int]) -> list[int]:
result = [-1] * len(A)
stack = []
for i in range(len(A)):
while stack and A[stack[-1]] <= A[i]:
stack.pop()
if stack:
result[i] = stack[-1]
stack.append(i)
return result
def f(A: list[int]) -> int:
greaters = preceding_larger(A)
# First in the pair is if A_i is last in a segment,
# second is if A_i is not last in a segment
dp = [[0, 0] for _ in A] + [(0, 0)]
for i in range(len(A)):
# A_i is last
dp[i][0] = -float('inf') if greaters[i] == -1 else 1 + max(dp[greaters[i] - 1])
# A_i is not last
if i < len(A) - 1:
dp[i][1] = max(dp[i - 1])
return max(dp[-2])
examples = [
[1, 2, 3, 2, 6, 3], # 2
[8, 5, 4, 7, 2], # 2
[4, 3, 6, 5, 3, 4, 7, 1], # 3
[10, 9, 8, 9, 8, 9, 8, 7], # 3
[10, 9, 8, 7, 9, 8, 7, 9, 8, 7], # 4
[10, 5, 6, 4, 7, 6, 4, 2, 7, 1, 4, 6, 3, 4, 5, 1, 7, 5, 4, 6, 7, 8, 4, 6, 1, 9, 9], # 1
[1, 2, 3, 4, 5, 6, 7], # 0
[10, 2, 1, 2, 1, 2, 1, 9, 8, 7] # 4
]
for A in examples:
print((A, f(A)))
ZGVmIHByZWNlZGluZ19sYXJnZXIoQTogbGlzdFtpbnRdKSAtPiBsaXN0W2ludF06CiAgcmVzdWx0ID0gWy0xXSAqIGxlbihBKQogIHN0YWNrID0gW10gIAoKICBmb3IgaSBpbiByYW5nZShsZW4oQSkpOgogICAgd2hpbGUgc3RhY2sgYW5kIEFbc3RhY2tbLTFdXSA8PSBBW2ldOgogICAgICBzdGFjay5wb3AoKQogICAgaWYgc3RhY2s6CiAgICAgIHJlc3VsdFtpXSA9IHN0YWNrWy0xXQogICAgc3RhY2suYXBwZW5kKGkpCgogIHJldHVybiByZXN1bHQKCgpkZWYgZihBOiBsaXN0W2ludF0pIC0+IGludDoKICBncmVhdGVycyA9IHByZWNlZGluZ19sYXJnZXIoQSkKCiAgIyBGaXJzdCBpbiB0aGUgcGFpciBpcyBpZiBBX2kgaXMgbGFzdCBpbiBhIHNlZ21lbnQsCiAgIyBzZWNvbmQgaXMgaWYgQV9pIGlzIG5vdCBsYXN0IGluIGEgc2VnbWVudAogIGRwID0gW1swLCAwXSBmb3IgXyBpbiBBXSArIFsoMCwgMCldCgogIGZvciBpIGluIHJhbmdlKGxlbihBKSk6CiAgICAjIEFfaSBpcyBsYXN0CiAgICBkcFtpXVswXSA9IC1mbG9hdCgnaW5mJykgaWYgZ3JlYXRlcnNbaV0gPT0gLTEgZWxzZSAxICsgbWF4KGRwW2dyZWF0ZXJzW2ldIC0gMV0pCgogICAgIyBBX2kgaXMgbm90IGxhc3QKICAgIGlmIGkgPCBsZW4oQSkgLSAxOgogICAgICBkcFtpXVsxXSA9IG1heChkcFtpIC0gMV0pCgogIHJldHVybiBtYXgoZHBbLTJdKQoKCmV4YW1wbGVzID0gWwogIFsxLCAyLCAzLCAyLCA2LCAzXSwgICMgMgogIFs4LCA1LCA0LCA3LCAyXSwgICMgMgogIFs0LCAzLCA2LCA1LCAzLCA0LCA3LCAxXSwgICMgMwogIFsxMCwgOSwgOCwgOSwgOCwgOSwgOCwgN10sICAjIDMKICBbMTAsIDksIDgsIDcsIDksIDgsIDcsIDksIDgsIDddLCAgIyA0CiAgWzEwLCA1LCA2LCA0LCA3LCA2LCA0LCAyLCA3LCAxLCA0LCA2LCAzLCA0LCA1LCAxLCA3LCA1LCA0LCA2LCA3LCA4LCA0LCA2LCAxLCA5LCA5XSwgICMgMQogIFsxLCAyLCAzLCA0LCA1LCA2LCA3XSwgICMgMAogIFsxMCwgMiwgMSwgMiwgMSwgMiwgMSwgOSwgOCwgN10gIyA0Cl0KCmZvciBBIGluIGV4YW1wbGVzOgogIHByaW50KChBLCBmKEEpKSk=
([1, 2, 3, 2, 6, 3], 2)
([8, 5, 4, 7, 2], 2)
([4, 3, 6, 5, 3, 4, 7, 1], 3)
([10, 9, 8, 9, 8, 9, 8, 7], 3)
([10, 9, 8, 7, 9, 8, 7, 9, 8, 7], 4)
([10, 5, 6, 4, 7, 6, 4, 2, 7, 1, 4, 6, 3, 4, 5, 1, 7, 5, 4, 6, 7, 8, 4, 6, 1, 9, 9], 1)
([1, 2, 3, 4, 5, 6, 7], 0)
([10, 2, 1, 2, 1, 2, 1, 9, 8, 7], 4)