結果
| 問題 |
No.209 Longest Mountain Subsequence
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2015-05-15 23:31:48 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,331 bytes |
| コンパイル時間 | 99 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 11,008 KB |
| 最終ジャッジ日時 | 2024-07-06 04:18:22 |
| 合計ジャッジ時間 | 2,746 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 1 WA * 5 |
ソースコード
def read_data():
N = int(input())
As = list(map(int, input().split()))
return N, As
def solve(N, As):
if N <= 2:
return N
dp1 = longest_increasing(N, As)
As.reverse()
dp2 = longest_increasing(N, As)
dp2.reverse()
return max(d1 + d2 - 1 for d1, d2 in zip(dp1, dp2))
def longest_increasing(N, As):
''' As の部分列で、b0 < b1 < b2... b1 - b0 < b2 - b1 < ... となるものを返す。
dp[i] には、As[:i] および As[i] を用いてできる部分列の中で最長のものの長さを入れる。
ただし、As[i] を終端に必ず用いるものとする。
'''
dp = []
for i in range(N):
dp.append(longest_inc(As[:i+1]))
return dp
def longest_inc(As):
'''
'''
bs = As[::-1]
bs = [bs[0]] + [b for b in bs if b < bs[0]]
return longest_dec(bs)
def longest_dec(bs):
n = len(bs)
dp = [0] * n
gap = [0] * n
dp[0] = 1
gap[0] = float('inf')
for i, b in enumerate(bs[1:], 1):
for j in range(i-1, -1, -1):
if b < bs[j] < gap[j] + b:
gap[i] = bs[j] - b
dp[i] = dp[j] + 1
break
return max(dp)
if __name__ == '__main__':
T = int(input())
for t in range(T):
N, As = read_data()
print(solve(N, As))