# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1207724 | AmirElarbi | Skyscraper (JOI16_skyscraper) | C++20 | 53 ms | 38228 KiB |
#include <bits/stdc++.h>
#include <random>
#define vi vector<int>
#define ve vector
#define ll long long
#define vf vector<float>
#define vll vector<pair<ll,ll>>
#define ii pair<int,int>
#define pll pair<ll,ll>
#define vvi vector<vi>
#define vii vector<ii>
#define gii greater<ii>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define INF 2e9+5
#define eps 1e-7
#define eps1 1e-25
#define optimise ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define MAX_A 1e5+5
#define V 450
using namespace std;
const int MOD = 1e9;
const int MAXK = 1e9;
const int lg = 20;
const int N = 15;
const int L = 105;
const string SUBTASK = "6";
int sol1(int n, int l){
vi a;
for(int i = 1; i <= n; i++) a.pb(i);
int res = 0;
sort(a.begin(), a.end());
do{
int sm = 0;
for(int i = 0; i < n-1; i++){
sm += abs(a[i] - a[i+1]);
}
if(sm <= l) res++;
} while(next_permutation(a.begin(), a.end()));
return res;
}
const int mod = 1e9+7;
int dp[(1 << N)][N][L];
int sol2(vi A, int n, int l){
// initialiser les cas de bases
for(int i = 0; i < n; i++)
dp[1 << i][i][0] = 1;
for(int i = 0; i < 1<<n; i++){
// i représente les éléments déjà utilisés
for(int lst = 0; lst < n; lst++){
// lst est le dernier élément qu'on a choisi pour le moment
// vérifier que l'élément séléctionné est present dans le bitmask
if(i & (1 << lst))
for(int cur = 0; cur < n; cur++){
// cur est l'élément qu'on va choisir pour la position suivante
// vérifier qu'il n'existe pas déjà dans le bitmask
if(!(i & (1 << cur))){
int cout = abs(A[cur]-A[lst]);
for(int cst = 0; cst <= l; cst++)
// cst est la somme des différences consécutifs des éléments déja présents
dp[i|(1 << cur)][cur][cst+cout] = (dp[i|(1 << cur)][cur][cst+cout] + dp[i][lst][cst])%mod;
}
}
}
}
long long rep = 0;
// la réponse finale est la somme des états qui ont une somme inférieur à l tels que tous les éléments sont utilisés
// On ne s'intéresse pas donc au dernier élément choisi -> on somme tout les cas possibles
for(int cst = 0; cst <= l; cst++)
for(int lst = 0; lst < n; lst ++){
rep += dp[(1 << n)-1][lst][cst];
rep %= mod;
}
return rep;
}
int main() {
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
int N,L;
cin >> N >> L;
vi A;
for(int i = 0; i < N; i++){
int a;
cin >> a;
A.pb(a);
}
cout << sol2(A,N,L) << endl;
}
Compilation message (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... |