結果
| 問題 | No.3 ビットすごろく |
| コンテスト | |
| ユーザー |
aimBULL
|
| 提出日時 | 2016-06-02 00:53:56 |
| 言語 | Java (openjdk 23) |
| 結果 |
AC
|
| 実行時間 | 139 ms / 5,000 ms |
| コード長 | 1,306 bytes |
| コンパイル時間 | 2,112 ms |
| コンパイル使用メモリ | 77,716 KB |
| 実行使用メモリ | 41,720 KB |
| 最終ジャッジ日時 | 2024-07-01 07:57:47 |
| 合計ジャッジ時間 | 7,575 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 33 |
ソースコード
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.close();
int[] memo = create(n);
calc(1, memo);
System.out.println(memo[n] == Integer.MAX_VALUE ? -1 : memo[n]);
}
// データの格納領域を作成する
public static int[] create(int n){
int[] memo = new int[n+1];
memo[0] = Integer.MAX_VALUE;
memo[1] = 1;
for(int i = 2; i < memo.length; i++){
memo[i] = Integer.MAX_VALUE;
}
return memo;
}
// 移動距離計算する
// 移動可能なマスの範囲内で移動距離を短縮できる間、再帰的に処理する
public static void calc(int pos, int[] memo){
int cnt = Integer.bitCount(pos);
// 移動した場合の移動距離を計算しておく
int cost = memo[pos] + 1;
// 前進
{
int nextPos = pos + cnt;
// 移動数が小さくなるなら、結果を記録して次のマスへ
if(nextPos < memo.length && cost < memo[nextPos]){
memo[nextPos] = cost;
calc(nextPos, memo);
}
}
// 後退
{
int prevPos = pos - cnt;
// 移動数が小さくなるなら、結果を記録して次のマスへ
if(prevPos > 0 && cost < memo[prevPos]){
memo[prevPos] = cost;
calc(prevPos, memo);
}
}
}
}
aimBULL