답안 #164688

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
164688 2019-11-22T15:57:36 Z ttnhuy313 Skyscraper (JOI16_skyscraper) C++14
100 / 100
461 ms 173964 KB
#include <bits/stdc++.h>

using namespace std;

const int N = 105, L = 1005, MOD = 1e9 + 7;
int dp[N][L][2][N][2], a[N], n, maxCost;

void add(int &a, int b) {
	a = (a + b) % MOD;
	return;
}

int calc(int pos, int curCost, int l, int k, int r) {
	int nxtCost = curCost;
	if (pos > 1)
		nxtCost += (l + (k << 1) + r) * abs(a[pos] - a[pos - 1]);
	if (nxtCost > maxCost) return 0;
	if (k < 0) return 0;
	if (pos == n)
		return (k == 0 ? 1 : 0);
	if (~dp[pos][curCost][l][k][r]) return dp[pos][curCost][l][k][r];
	int ret = 0;
	add(ret, calc(pos + 1, nxtCost, 1, k, r));
	add(ret, 1LL * calc(pos + 1, nxtCost, 1, k - 1, r) * k % MOD);
	add(ret, calc(pos + 1, nxtCost, l, k, 1));
	add(ret, 1LL * calc(pos + 1, nxtCost, l, k - 1, 1) * k % MOD);
	add(ret, calc(pos + 1, nxtCost, l, k + 1, r));
	add(ret, 1LL * calc(pos + 1, nxtCost, l, k - 1, r) * k * (k - 1) % MOD);
	add(ret, 1LL * calc(pos + 1, nxtCost, l, k, r) * k * 2 % MOD);
	ret %= MOD;
	return dp[pos][curCost][l][k][r] = ret;
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);

	memset(dp, -1, sizeof dp);
	cin >> n >> maxCost;
	for (int i = 1; i <= n; ++i)
		cin >> a[i];
	sort(a + 1, a + 1 + n);
	cout << calc(1, 0, 0, 0, 0) << endl;

	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 153 ms 173920 KB Output is correct
2 Correct 152 ms 173868 KB Output is correct
3 Correct 151 ms 173816 KB Output is correct
4 Correct 151 ms 173820 KB Output is correct
5 Correct 160 ms 173916 KB Output is correct
6 Correct 151 ms 173776 KB Output is correct
7 Correct 151 ms 173816 KB Output is correct
8 Correct 152 ms 173788 KB Output is correct
9 Correct 151 ms 173796 KB Output is correct
10 Correct 159 ms 173856 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 156 ms 173728 KB Output is correct
2 Correct 164 ms 173788 KB Output is correct
3 Correct 164 ms 173724 KB Output is correct
4 Correct 161 ms 173888 KB Output is correct
5 Correct 163 ms 173876 KB Output is correct
6 Correct 162 ms 173756 KB Output is correct
7 Correct 156 ms 173840 KB Output is correct
8 Correct 158 ms 173896 KB Output is correct
9 Correct 151 ms 173816 KB Output is correct
10 Correct 162 ms 173940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 153 ms 173920 KB Output is correct
2 Correct 152 ms 173868 KB Output is correct
3 Correct 151 ms 173816 KB Output is correct
4 Correct 151 ms 173820 KB Output is correct
5 Correct 160 ms 173916 KB Output is correct
6 Correct 151 ms 173776 KB Output is correct
7 Correct 151 ms 173816 KB Output is correct
8 Correct 152 ms 173788 KB Output is correct
9 Correct 151 ms 173796 KB Output is correct
10 Correct 159 ms 173856 KB Output is correct
11 Correct 156 ms 173728 KB Output is correct
12 Correct 164 ms 173788 KB Output is correct
13 Correct 164 ms 173724 KB Output is correct
14 Correct 161 ms 173888 KB Output is correct
15 Correct 163 ms 173876 KB Output is correct
16 Correct 162 ms 173756 KB Output is correct
17 Correct 156 ms 173840 KB Output is correct
18 Correct 158 ms 173896 KB Output is correct
19 Correct 151 ms 173816 KB Output is correct
20 Correct 162 ms 173940 KB Output is correct
21 Correct 161 ms 173816 KB Output is correct
22 Correct 461 ms 173940 KB Output is correct
23 Correct 430 ms 173944 KB Output is correct
24 Correct 407 ms 173964 KB Output is correct
25 Correct 458 ms 173804 KB Output is correct
26 Correct 389 ms 173816 KB Output is correct
27 Correct 229 ms 173816 KB Output is correct
28 Correct 264 ms 173816 KB Output is correct
29 Correct 386 ms 173816 KB Output is correct
30 Correct 455 ms 173944 KB Output is correct