# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
199368 | CaroLinda | Skyscraper (JOI16_skyscraper) | C++14 | 2630 ms | 171232 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
const int MOD = 1e9+7 ;
const int MAXL = 110 ;
const int MAXN = 15 ;
using namespace std ;
int n , l ;
int f[MAXN] ;
long long dp[ (1<<14)+100 ][ MAXL ][ MAXN ] ;
bool isOn(int mask, int i) { return ((1<<i)&mask) != 0 ; }
long long solve(int mask, int left, int ant)
{
if( dp[mask][left][ant] != -1 ) return dp[mask][left][ant] ;
if( mask == ( 1<<n )-1 ) return 1 ;
dp[mask][left][ant] = 0 ;
for(int i = 0 ; i < n ; i++ )
if( !isOn(mask, i) && left >= abs( f[i+1] - f[ant+1] ) )
dp[mask][left][ant] = ( dp[mask][left][ant] + solve( mask|(1<<i) , left - abs(f[i+1]-f[ant+1]) , i ) ) % MOD ;
return dp[mask][left][ant] ;
}
int main()
{
scanf("%d%d", &n , &l ) ;
for(int i = 1 ; i <= n ; i++ ) scanf("%d", &f[i]) ;
if( n <= 8 )
{
sort( f+1, f+1+n ) ;
int ans = 0 , soma = 0 ;
for(int i = 1 ; i < n ; i++ )
soma += abs( f[i] - f[i+1] ) ;
if( soma <= l ) ans ++ ;
while( next_permutation( f+1, f+1+n ) )
{
soma = 0;
for(int i = 1 ; i < n ; i++ )
soma += abs( f[i] - f[i+1] ) ;
if( soma <= l ) ans ++ ;
}
printf("%d\n" , ans ) ;
return 0 ;
}
long long ans = 0LL ;
memset(dp, -1, sizeof dp ) ;
for( int i = 0 ; i < n ; i++ )
ans = ( ans + solve( (1<<i) , l , i ) ) % MOD ;
printf("%lld\n" , ans ) ;
}
컴파일 시 표준 에러 (stderr) 메시지
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |