제출 #480491

#제출 시각아이디문제언어결과실행 시간메모리
480491JooSkyscraper (JOI16_skyscraper)C++17
100 / 100
263 ms84568 KiB
#include <bits/stdc++.h> using namespace std; const int N = 110; using ll = long long; ll dp[N][N][N*10][3],mod = 1000000007; int n,L,a[N]; int main(void){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> L; for(int i = 1; i <= n; i++){ cin >> a[i]; } if(n == 1){ cout << 1; return 0;} sort(a+1, a+n+1); dp[1][1][0][0] = 1; dp[1][1][0][1] = 2; for(int i = 1; i < n; i++){ for(int j = 1; j <= i; j++){ for(int k = 0; k <= L; k++){ for(int l = 0; l <= 2; l++){ int nk = 0; if(l < 2){ ///add end point nk = k+((j)*2-l)*abs(a[i+1]-a[i]); if(nk <= L){ ///create new component at end point dp[i+1][j+1][nk][l+1] += dp[i][j][k][l]*(2-l); dp[i+1][j+1][nk][l+1] %= mod; } nk = k+(j*2-l)*abs(a[i+1]-a[i]); ///append i+1th from previous block where i+1th also is end point if(nk <= L){ dp[i+1][j][nk][l+1] += dp[i][j][k][l]*(2-l); dp[i+1][j][nk][l+1] %= mod; } /*nk = k+((j-1)*2-l-1)*abs(a[i+1]-a[i]); ///merge ? if(nk <= L){ dp[i+1][j-1][nk][l+1] += dp[i][j][k][l]*(2-l); dp[i+1][j-1][nk][l+1] %= mod; }*/ } nk = k+((j)*2-l)*abs(a[i+1]-a[i]); ///create new component if(nk <= L){ dp[i+1][j+1][nk][l] += dp[i][j][k][l]*(j+1-l); dp[i+1][j+1][nk][l] %= mod; } nk = k+(j*2-l)*abs(a[i+1]-a[i]); ///append to right most or left most of existing component if(nk <= L){ dp[i+1][j][nk][l] += dp[i][j][k][l]*(2*j-l); dp[i+1][j][nk][l] %= mod; } nk = k+((j)*2-l)*abs(a[i+1]-a[i]); ///merge component with i+1th if(nk <= L){ dp[i+1][j-1][nk][l] += dp[i][j][k][l]*(j-1); dp[i+1][j-1][nk][l] %= mod; } } } } } ll ans = 0; for(int i = 0; i <= L; i++) ans = (ans+dp[n][1][i][2])%mod; cout << ans << "\n"; /*for(int i = 1; i <= n; i++){ cout << "I " << i << "\n"; for(int j = 1; j <= i; j++){ cout << "CMP : " << j << "\n"; for(int k = 0; k <= L; k++){ cout << "SUM " << k << " : "; for(int l = 0; l <= 2; l++){ cout << dp[i][j][k][l] << " "; } cout << "\n"; } } cout << "\n"; }*/ return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...