結果

問題 No.336 門松列列
ユーザー 37zigen37zigen
提出日時 2016-06-17 11:45:24
言語 Java21
(openjdk 21)
結果
TLE  
実行時間 -
コード長 1,095 bytes
コンパイル時間 2,209 ms
コンパイル使用メモリ 77,012 KB
実行使用メモリ 88,540 KB
最終ジャッジ日時 2024-04-17 23:06:45
合計ジャッジ時間 8,918 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 TLE -
testcase_01 -- -
testcase_02 -- -
testcase_03 -- -
testcase_04 -- -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

package yukicoder;

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		new Main().solver();
	}

	void solver() {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		for (int i = 0; i < 2020; i++) {
			for (int j = 0; j < 2020; j++) {
				memo[i][j] = -1;
			}
		}
		long ans=0;
		for(int i=0;i<N;i++){
			ans=(ans+dp(i,N-i-1))%MOD;
		}
		System.out.println(2*ans%MOD);

	}

	long[][] memo = new long[2020][2020];
	final long MOD = 1000000007;

	// 戻り値:上にa個、下にb個、数字があるとき、いくつの門松列の作り方があるか。
	// ただし、上に飛ぶケースのみ考える
	// (下に飛ぶケースについては、a,bを逆転することで上に飛ぶケースに帰着)
	long dp(int a, int b) {
		if(a<0||b<0)return 0;
		if (memo[a][b] != -1)
			return memo[a][b];
		if(a==1&&b==0)return 1;
		if(a==0&&b>0)return 0;
		if(a==0&&b==0)throw new AssertionError("error");
		long sum = 0;
		for (int i = 1; i <= a; i++) {
			sum += dp(b + i - 1, a - i);
			sum%=MOD;
		}
		return memo[a][b]=sum;
	}
}
0