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