➤ 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!!
