HIST2 - Histogram - SPOJ Solution C++

  Problem Link : HIST2 


👉 Hint : DP with Bitmasking

 


✅ C++ Solution :

 
#include<bits/stdc++.h>
using namespace std;
 
#define ll long long int
 
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0)
            break;
        int ht[n];
        for(int i=0;i<n;i++)
            cin>>ht[i];
 
        ll val=pow(2,n);
        pair<ll,ll> dp[val+1][n];
        memset(dp,0,sizeof(dp));
        for(int i=0;i<n;i++)
        {
            ll val=1<<i;
            dp[val][i]=make_pair(2*ht[i]+2,1);
        }
        ll ans=0,cnt=0;
        for(ll i=1;i<val;i++)
        {
            for(ll j=0;j<n;j++)  
            {
                if(!(i & (1<<j)))
                    continue;
                for(ll k=0;k<n;k++)
                {
                    if(!(i & (1<<k)))
                    {
                        ll tp=dp[i][j].first-ht[j] + 2+ ht[k]+abs(ht[k]-ht[j]);
                        if(dp[i | 1<<k][k].first == tp)
                            dp[i | 1<<k][k].second+=dp[i][j].second;
                        else if(dp[i | 1<<k][k].first < tp)
                        {
                            dp[i | 1<<k][k].first = tp;
                            dp[i | 1<<k][k].second = dp[i][j].second;
                        }                 
                    }
                }
            }
        }
           
        for(ll i=0;i<n;i++)
        {
             if(ans< dp[val-1][i].first)
            {
                ans = dp[val-1][i].first;
                cnt =dp[val-1][i].second;
            }
            else if(ans==dp[val-1][i].first)
                cnt+=dp[val-1][i].second;
        }
        cout<<ans<<" "<<cnt<<endl;
    }
} 

 

Thank you for your patience reading. If you enjoyed this post, I’d be very grateful if you’d help it spread by emailing it to a friend, or sharing it on Whatsapp or Facebook. 

😇Happy Learning!!