結果
問題 | No.258 回転寿司(2) |
ユーザー | scache |
提出日時 | 2015-11-17 15:20:55 |
言語 | Java (openjdk 23) |
結果 |
AC
|
実行時間 | 269 ms / 2,000 ms |
コード長 | 1,585 bytes |
コンパイル時間 | 3,958 ms |
コンパイル使用メモリ | 85,192 KB |
実行使用メモリ | 48,428 KB |
最終ジャッジ日時 | 2024-11-06 18:56:43 |
合計ジャッジ時間 | 21,333 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 67 |
ソースコード
import java.util.ArrayList; import java.util.Collections; import java.util.Scanner; public class Main258 { public static void main(String[] args){ new Main258(); } public Main258(){ Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] v = new int[n]; for(int i=0;i<n;i++) v[i] = sc.nextInt(); solve(v); } private void solve(int[] v){ int n = v.length; int[][] dp = new int[n+1][n]; for(int i=0;i<dp[1].length;i++) dp[1][i] = v[0]; for(int i=2;i<=n;i++){ for(int j=0;j<n;j++){ dp[i][j] = Math.max(dp[i-1][j], dp[i-2][j]+v[i-1]); } } int mindex = 0; for(int i=0;i<n;i++){ if(dp[n][mindex]<dp[n][i]){ mindex = i; } } System.out.println(dp[n][mindex]); ArrayList<Integer> l = new ArrayList<>(); int cur = n; while(cur>1){ while(dp[cur][mindex]==dp[cur-1][mindex]){ cur--; } if(cur<=1) break; for(int i=0;i<n;i++) { if(dp[cur][mindex]==dp[cur-2][i]+v[cur-1]){ l.add(cur); mindex = i; cur-=2; break; } } } if(cur==1) l.add(1); for(int i=l.size()-1;0<i;i--){ System.out.print(l.get(i)+" "); } System.out.println(l.get(0)); } }