➤ Problem Link : TWENDS
👉 Hint : Use DP and Greedy approach
✅ C++ Solution :
#include<bits/stdc++.h> using namespace std; int dp[1001][1001]; int arr[1000]; int f(int i,int j) { if(i==j) return 0; if(arr[i]>=arr[j]) return dp[i+1][j]; else if(arr[i]<arr[j]) return dp[i][j-1]; } int main() { int k=0; while(1) { ++k; int n; cin>>n; if(n==0) break; bool a2[n]; memset(a2,0,sizeof(a2)); for(int i=0;i<n;i++) { cin>>arr[i]; } for(int i=0;i<n;i++) { dp[i][i]=arr[i]; } int greedy=0; for(int k=1;k<n;k++) { int i,j; for(i=0,j=k;i<n,j<n;i++,j++) { dp[i][j]=max(arr[i]+f(i+1,j),arr[j]+f(i,j-1)); } } int i=0,j=n-1; while(i<j) { if(dp[i][j]==arr[i]+f(i+1,j)) { if(arr[i+1]>=arr[j]) { greedy+=arr[i+1]; i+=2; } else { greedy+=arr[j]; i++;j--; } } else { if(arr[i]>=arr[j-1]) { greedy+=arr[i]; i++;j--; } else { greedy+=arr[j-1]; j-=2; } } } cout<<"In game "<<k<<", the greedy strategy might lose by as many as "<<dp[0][n-1]-greedy<<" points."<<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!!