結果
| 問題 | 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);
			}
		}
	}
}
            
            
            
        