제출 #586603

#제출 시각아이디문제언어결과실행 시간메모리
586603blueSkyscraper (JOI16_skyscraper)C++17
20 / 100
166 ms89096 KiB
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

using ll = long long;
using vi = vector<int>;

const ll mod = 1'000'000'007LL;

ll ad(ll a, ll b)
{
	return (a+b) % mod;
}

int main()
{
	int N, L;
	cin >> N >> L;

	vi A(N);
	for(int i = 0; i < N; i++)
		cin >> A[i];

	int DP[(1<<N)][N][1+L];
	for(int m = 0; m < (1<<N); m++)
		for(int i = 0; i < N; i++)
			for(int l = 0; l <= L; l++)
				DP[m][i][l] = 0;

	for(int i = 0; i < N; i++)
		DP[(1<<i)][i][0] = 1;

	for(int m = 0; m < (1<<N); m++)
	{
		for(int i = 0; i < N; i++)
		{
			if(!(m & (1<<i)))
				continue;

			if(m == (1<<i))
				continue;

			int m2 = m ^ (1<<i);

			for(int j = 0; j < N; j++)
			{
				if(!(m2 & (1<<j)))
					continue;

				for(int l = abs(A[i] - A[j]); l <= L; l++)
					DP[m][i][l] = ad(DP[m][i][l], DP[m2][j][l - abs(A[i] - A[j])]);
			}
		}
	}

	int res = 0;
	for(int i = 0; i < N; i++)
		for(int z = 0; z <= L; z++)
			res = ad(res, DP[(1<<N) - 1][i][z]);

	cout << res << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...