アルゴリズム


この問題は比較的回り道の問題だが、その中の論理関係を理解すれば、問題はすぐに解決できる.2つの注意点がある.
  • 再帰を呼び出し、再帰関数の良し悪しはアルゴリズムが成功するかどうかを決定する(論理が複雑である)
  • ダイナミックプランニング、空間交換時間によりコード性能が向上(ダイナミックプランニングを行わずにデータ量の小さい30%のデータ、すなわち30%の点数しか得られない)ボールゲーム:
  • 二人でボールを取るゲームをします.全部でN個のボールがあり、一人一人が交代でボールを取り、毎回集合{n 1,n 2,n 3}のいずれかの数を取ることができる.ボールを取り続けることができなければ、ゲームは終了します.この時、奇数球を持った方が勝つ.2人とも奇数なら引き分けだ.
    もし双方が最も賢い取り方を採用したとしたら、最初の取り方は必ず勝つことができますか?この問題をプログラミングして解決する.
    入力フォーマット:1行目3個の正整数n 1 n 2 n 3、スペース分割、毎回取るべき数を表す(0行目5個の正整数x 1 x 2...x 5、スペース分割、5局の初期球数を表す(0
    出力フォーマット:1行5文字、スペースが分かれています.各セットで先取した人が勝つかどうかをそれぞれ示す.勝つことができれば出力+,次に,相手を追いつめる方法があれば出力0,どうしても負けるなら出力-
    static int[] a=new int[3];
    	static char[][][] cache=new char[1000][2][2];//1 0 
    	public static void main(String[] args) {
    		Scanner reader=new Scanner(System.in);
    		for(int i = 0;i<3;i++) {
    			a[i]=reader.nextInt();
    		}
    		Arrays.sort(a);
    		for(int i=0;i<5;i++) {
    			System.out.print(test(reader.nextInt(),0,0)+" ");
    		}
    	}
    	private static char test(int n, int me, int you) {
    		if(n

    まず問題に対する理解であり、いかなる選択に対しても1つの勝利があれば、return'+'が存在しなければ、このような状況が存在しないかどうかを見て、->return'0'else return'-'がある.
    それから再帰関数の理解で、最初は私が選んだので、結果はどのようにあなたが選んだ結果に依存します.あなたが選択する番になったときも同じ再帰関数を呼び出すので、また私に戻って選択して、関数から飛び出すことができて、結果を知ることができます.多くの再帰関数はこのように書かれており,関数の出口を方向とすることができる動力を与える.
    時間があれば、動的計画法を考えることができます.テーブルにデータがある場合は、テーブルを調べることができます.