結果
問題 | No.209 Longest Mountain Subsequence |
ユーザー | takeya_okino |
提出日時 | 2017-07-06 11:23:15 |
言語 | Java21 (openjdk 21) |
結果 |
MLE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,967 bytes |
コンパイル時間 | 2,028 ms |
コンパイル使用メモリ | 77,684 KB |
実行使用メモリ | 67,032 KB |
最終ジャッジ日時 | 2024-10-06 03:33:10 |
合計ジャッジ時間 | 5,791 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 495 ms
62,764 KB |
testcase_01 | AC | 410 ms
61,672 KB |
testcase_02 | AC | 341 ms
60,092 KB |
testcase_03 | MLE | - |
testcase_04 | MLE | - |
testcase_05 | AC | 255 ms
57,800 KB |
ソースコード
import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int T = sc.nextInt(); for(int i = 0; i < T; i++) { int N = sc.nextInt(); int[] a = new int[N]; for(int j = 0; j < N; j++) { a[j] = sc.nextInt(); } // dp[i][j]は右端がaj,aiとなるような狭義単調増加列の最長の長さ int[][] dp = new int[N][N]; for(int j = 0; j < N; j++) { dp[j][j] = 1; } for(int j = 1; j < N; j++) { for(int k = 0; k < j; k++) { int len = 0; if(a[j] > a[k]) { len = 2; for(int l = 0; l < k; l++) { if(a[k] > a[l] && a[k] - a[l] < a[j] - a[k]) len = Math.max(len, dp[k][l] + 1); } } dp[j][k] = len; } } // dp2[i][j]は左端がai,ajとなるような狭義単調減少列の最長の長さ int[][] dp2 = new int[N][N]; for(int j = 0; j < N; j++) { dp2[j][j] = 1; } for(int j = N - 1; j >= 0; j--) { for(int k = j + 1; k < N; k++) { int len = 0; if(a[j] > a[k]) { len = 2; for(int l = k + 1; l < N; l++) { if(a[k] > a[l] && a[k] - a[l] < a[j] - a[k]) len = Math.max(len, dp2[k][l] + 1); } } dp2[j][k] = len; } } int[] left = new int[N]; for(int j = 0; j < N; j++) { int m = 0; for(int k = 0; k <= j; k++) { m = Math.max(m, dp[j][k]); } left[j] = m; } int[] right = new int[N]; for(int j = 0; j < N; j++) { int m = 0; for(int k = j; k < N; k++) { m = Math.max(m, dp2[j][k]); } right[j] = m; } int ans = 0; for(int j = 0; j < N; j++) { ans = Math.max(ans, left[j] + right[j] - 1); } System.out.println(ans); } } }