結果

問題 No.1561 connect x connect
ユーザー uwiuwi
提出日時 2020-11-23 23:35:27
言語 Java
(openjdk 23)
結果
RE  
(最新)
AC  
(最初)
実行時間 -
コード長 3,113 bytes
コンパイル時間 4,776 ms
コンパイル使用メモリ 90,332 KB
実行使用メモリ 70,620 KB
最終ジャッジ日時 2024-06-25 07:54:01
合計ジャッジ時間 18,851 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 17 RE * 16 TLE * 1
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class P5518 {
	static Scanner in;
	static PrintWriter out;
	static String INPUT = "";

	static final int mod = 1000000007;

	static void solve()
	{
		int n = ni(), m = ni();
		int[] a = new int[n];
		Arrays.fill(a, -1);
		State ini = new State(a, 1L, 0);
		Map<Long, State> dp = new HashMap<>();
		dp.put(ini.h(), ini);

		//     7654
		// 3210N
		for(int j = 0;j < m+1;j++){
			for(int i = 0;i < n;i++){
				Map<Long, State> ndp = new HashMap<>();
				for(State s : dp.values()){
					// 黒いセルを追加
					{
						int[] nclus = new int[n];
						for(int k = 0;k < n-1;k++)nclus[k+1] = s.clus[k];
						nclus[0] = n;
						if(i > 0 && s.clus[0] != -1){
							for(int k = 1;k < n;k++)if(nclus[k] == s.clus[0])nclus[k] = n;
						}
						if(s.clus[n-1] != -1){
							for(int k = 1;k < n;k++)if(nclus[k] == s.clus[n-1])nclus[k] = n;
						}
						normalize(nclus);
						State ns = new State(nclus, s.val, s.hidden);
						add(ns, ndp);
					}
					// 白いセルを追加
					{
						int[] nclus = new int[n];
						for(int k = 0;k < n-1;k++)nclus[k+1] = s.clus[k];
						nclus[0] = -1;
						int nhidden = s.hidden;
						if(s.clus[n-1] != -1) {
							nhidden++;
							for (int k = 0; k < n - 1; k++) {
								if (s.clus[k] == s.clus[n - 1]) {
									nhidden--;
									break;
								}
							}
						}

						if(nhidden <= 1) {
							normalize(nclus);
							State ns = new State(nclus, s.val, nhidden);
							add(ns, ndp);
						}
					}
				}
				dp = ndp;
			}
		}

		long ans = 0;
		outer:
		for(State s : dp.values()){
			if(s.hidden != 1)continue;
			for(int i = 0;i < n;i++){
				if(s.clus[i] != -1)continue outer;
			}
			ans += s.val;
		}
		out.println(ans%mod);
	}

	static int[] normalize(int[] a)
	{
		int[] label = new int[11];
		Arrays.fill(label, -1);
		int p = 0;
		for(int i = 0;i < a.length;i++){
			if(a[i] == -1)continue;
			if(label[a[i]] == -1)label[a[i]] = p++;
			a[i] = label[a[i]];
		}
		return a;
	}

	static void add(State s, Map<Long, State> dp)
	{
		dp.merge(s.h(), s, (x, y) -> {
			y.val += x.val;
			if(y.val >= mod)y.val -= mod;
			return y;
		});
	}

	static class State
	{
		int[] clus;
		long val;
		int hidden; // clusに現れないが、すでに現れた連結成分の個数

		long h()
		{
			long h = 0;
			for(int v : clus){
				h = h * 1000000009 + v;
			}
			h = h * 1000000009 + hidden;
			return h;
		}

		public State(int[] clus, long val, int hidden) {
			this.clus = clus;
			this.val = val;
			this.hidden = hidden;
		}
	}
	
	public static void main(String[] args) throws Exception
	{
		in = INPUT.isEmpty() ? new Scanner(System.in) : new Scanner(INPUT);
		out = new PrintWriter(System.out);
		
		solve();
		out.flush();
	}
	
	static int ni() { return Integer.parseInt(in.next()); }
	static long nl() { return Long.parseLong(in.next()); }
	static double nd() { return Double.parseDouble(in.next()); }
	static void tr(Object... o) { if(INPUT.length() != 0)System.out.println(Arrays.deepToString(o)); }
}
0