Advertisement
Zeinab_Hamdy

Untitled

Jun 26th, 2024
845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.31 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define nl "\n"
  4. #define cnl cout << nl;
  5. #define fi first
  6. #define se second
  7. #define pb push_back
  8. #define ll long long
  9. #define ull unsigned ll
  10. #define RV return void
  11. #define sz(x) int(x.size())
  12. #define all(v) v.begin(), v.end()
  13. #define rall(v) v.rbegin(), v.rend()
  14. #define fixed(n) fixed << setprecision(n)
  15. #define cin(v) for(auto&x:v) cin >> x;
  16. #define cout(v) for(auto&x:v) cout << x << " ";
  17. void files(){
  18.     #ifndef ONLINE_JUDGE
  19.        freopen("input.txt", "r", stdin);
  20.        freopen("output.txt", "w", stdout);
  21.     #endif
  22. }
  23.  
  24. int n , ans , cnt=0;;
  25. vector < int > v ;
  26. vector < vector < int > > dp;
  27.  
  28.  
  29. int rec(int mask , int prev){
  30.     if(!mask) {
  31.         return v[prev] ;
  32.     }
  33.  
  34.     int &ret = dp[mask][prev];
  35.     if(~ret)
  36.         return ret ;
  37.     ret =0;
  38.  
  39.     for(int i = 0 ; i < n ; i++){
  40.         if((mask >> i) & 1 ){
  41.             if(prev == n + 1)
  42.                 ret =  max(ret , v[i] + rec( mask^(1<<i) , i ));
  43.             else
  44.                 ret =  max(ret , abs(v[prev]-v[i])+ rec( mask^(1<<i) , i ));
  45.         }
  46.     }
  47.  
  48.     return ret ;
  49. }
  50.  
  51.  
  52. void build(int mask , int prev){
  53.     if(!mask) {
  54.         return ;
  55.     }
  56.  
  57.     int ret = dp[mask][prev] , ret2=0;
  58.  
  59.     for(int i = 0 ; i < n ; i++){
  60.        
  61.         if((mask >> i) & 1 ){
  62.             if(prev == n+1)  
  63.                 ret2 = v[i] ;
  64.             else
  65.                 ret2= abs(v[prev]-v[i]);
  66.            
  67.             ret2 += rec( mask^(1<<i) , i );
  68.  
  69.             if(ret2 == ret) cnt++ , build(  mask^(1<<i) , i);
  70.         }
  71.     }
  72.  
  73.     return  ;
  74. }
  75.  
  76. void solve(){
  77.    
  78.     while(cin >> n and n){
  79.         v.assign(n,0);
  80.         for(int i =0 ; i < n and cin >> v[i] ; i++);
  81.  
  82.         //  2 * n + difference between any adj ( + start + end)
  83.         dp.assign(1 << n , vector < int > (n+2 , -1));
  84.  
  85.         ans = rec( (1 << n) - 1 , n+1 ) + 2*n;
  86.         cnt = 0;
  87.         build((1 << n) - 1 , n+1);
  88.         cout << ans << " " << cnt << nl;
  89.  
  90. // 20 8
  91. // 24 2
  92.  
  93.  
  94.  
  95.     }
  96.  
  97. }
  98.  
  99.  
  100. int main(){
  101.     ios_base::sync_with_stdio(false);
  102.     cin.tie(nullptr);
  103.     cout.tie(nullptr);
  104.                            
  105.     //  files();
  106.    
  107.    
  108.     int testCase=1;
  109.         // cin >> testCase ;
  110.     for(int i=1 ; i <= testCase ; i++){
  111.         solve();
  112.     }
  113.  
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement