Optimal strategy for a Game with modifications
Problem Statement: Consider a row of n coins of values v1 . . . vn, where n is even. We play a game against an opponent by alternating turns. In each turn, a player performs the following operation K times.
The player selects either the first or last coin from the row, removes it from the row permanently, and receives the value of the coin.
Determine the maximum possible amount of money the user can definitely win if the user moves first.
Note: The opponent is as clever as the user.
Examples:
Input : array = {10, 15, 20, 9, 2, 5}, k=2
Output :32
Explanation:
Lets say, user has initially picked 10 and 15.
The value of coins which the user has is 25 and
{20, 9, 2, 5} are remaining in the array.
In the second round, the opponent picks 20 and 9 making his value 29.
In the third round, the user picks 2 and 5 which makes his total value as 32.
Input: array = {10, 15, 20, 9, 2}, k=1
Output: 32
Approach:
A recursive solution needs to be formed and the values of sub problems needs to be stored to compute the result.
Taking an example to arrive at the recursive solution;
arr = {10, 15, 20, 9, 2, 5}, k=2
So if the user selects 10, 15 in the first turn then 20, 9, 2, 5 are left in the array.
But if the user selects 10, 5; then 15, 20, 9, 2 are left in the array.
Lastly, if the user selects 5, 2; then 10, 15, 20, 9 are left in the array.
So at any iteration after selecting k elements, a continuous subarray of length n-k is remaining for next computation.
So recursive solution can be formed where :
S(l, r) = (sum(l, r) – sum(l+i, l+i+n-k-1))+(sum(l+i, l+i+n-k-1) – S(l+i, l+i+n-k-1))
where l+i+n-k-1<=r
Sum of chosen elements Sc=(sum(l, r) – sum(l+i, l+i+n-k-1))
Now the opponent will perform the next turn so
Sum of Elements chosen in next steps = Total sum of present array from l to r –
Sum of elements chosen by opponent in next steps which is equal to
Nc=(sum(l+i, l+i+n-k-1) - S(l+i, l+i+n-k-1)).
S(l, r) = Sc + Nc
where,
Nc=(sum(l+i, l+i+n-k-1) - S(l+i, l+i+n-k-1))
Sc=(sum(l, r) - sum(l+i, l+i+n-k-1))
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
#define ll long long int
ll sum( int arr[], int l, int r)
{
ll s = 0;
for ( int i = l; i <= r; i++) {
s += arr[i];
}
return s;
}
ll dp[101][101][101] = { 0 };
ll solve( int arr[], int l, int r, int k)
{
if (r - l + 1 <= k)
return sum(arr, l, r);
if (dp[l][r][k])
return dp[l][r][k];
ll sum_ = sum(arr, l, r);
ll len_r = (r - l + 1) - k;
ll len = (r - l + 1);
ll ans = 0;
for ( int i = 0; i < len - len_r + 1; i++) {
ll sum_sub = sum(arr, i + l, i + l + len_r - 1);
ans = max(ans, (sum_ - sum_sub) + (sum_sub -
solve(arr, i + l, i + l + len_r - 1, k)));
}
dp[l][r][k] = ans;
return ans;
}
int main()
{
int arr[] = { 10, 15, 20, 9, 2, 5 }, k = 2;
int n = sizeof (arr) / sizeof ( int );
memset (dp, 0, sizeof (dp));
cout << solve(arr, 0, n - 1, k);
return 0;
}
|
Java
class GFG
{
static int sum( int arr[], int l, int r)
{
int s = 0 ;
for ( int i = l; i <= r; i++)
{
s += arr[i];
}
return s;
}
static int dp[][][] = new int [ 101 ][ 101 ][ 101 ] ;
static int solve( int arr[], int l, int r, int k)
{
if (r - l + 1 <= k)
return sum(arr, l, r);
if (dp[l][r][k] != 0 )
return dp[l][r][k];
int sum_ = sum(arr, l, r);
int len_r = (r - l + 1 ) - k;
int len = (r - l + 1 );
int ans = 0 ;
for ( int i = 0 ; i < len - len_r + 1 ; i++)
{
int sum_sub = sum(arr, i + l, i + l + len_r - 1 );
ans = Math.max(ans, (sum_ - sum_sub) + (sum_sub -
solve(arr, i + l, i + l + len_r - 1 , k)));
}
dp[l][r][k] = ans;
return ans;
}
public static void main (String[] args)
{
int arr[] = { 10 , 15 , 20 , 9 , 2 , 5 }, k = 2 ;
int n = arr.length;
System.out.println(solve(arr, 0 , n - 1 , k));
}
}
|
Python3
import numpy as np
def Sum (arr, l, r) :
s = 0 ;
for i in range (l, r + 1 ) :
s + = arr[i];
return s;
dp = np.zeros(( 101 , 101 , 101 ));
def solve(arr, l, r, k) :
if (r - l + 1 < = k) :
return Sum (arr, l, r);
if (dp[l][r][k]) :
return dp[l][r][k];
sum_ = Sum (arr, l, r);
len_r = (r - l + 1 ) - k;
length = (r - l + 1 );
ans = 0 ;
for i in range (length - len_r + 1 ) :
sum_sub = Sum (arr, i + l, i + l + len_r - 1 );
ans = max (ans, (sum_ - sum_sub) + (sum_sub -
solve(arr, i + l, i + l + len_r - 1 , k)));
dp[l][r][k] = ans;
return ans;
if __name__ = = "__main__" :
arr = [ 10 , 15 , 20 , 9 , 2 , 5 ]; k = 2 ;
n = len (arr);
print (solve(arr, 0 , n - 1 , k));
|
C#
using System;
class GFG
{
static int sum( int []arr, int l, int r)
{
int s = 0;
for ( int i = l; i <= r; i++)
{
s += arr[i];
}
return s;
}
static int [,,]dp = new int [101, 101, 101] ;
static int solve( int []arr, int l, int r, int k)
{
if (r - l + 1 <= k)
return sum(arr, l, r);
if (dp[l, r, k] != 0)
return dp[l, r, k];
int sum_ = sum(arr, l, r);
int len_r = (r - l + 1) - k;
int len = (r - l + 1);
int ans = 0;
for ( int i = 0; i < len - len_r + 1; i++)
{
int sum_sub = sum(arr, i + l, i + l + len_r - 1);
ans = Math.Max(ans, (sum_ - sum_sub) + (sum_sub -
solve(arr, i + l, i + l + len_r - 1, k)));
}
dp[l, r, k] = ans;
return ans;
}
public static void Main ()
{
int []arr = { 10, 15, 20, 9, 2, 5 };
int k = 2;
int n = arr.Length;
Console.WriteLine(solve(arr, 0, n - 1, k));
}
}
|
Javascript
<script>
function sum(arr, l, r)
{
let s = 0;
for (let i = l; i <= r; i++)
{
s += arr[i];
}
return s;
}
let dp = new Array(101);
for (let i = 0; i < 101; i++)
{
dp[i] = new Array(101);
for (let j = 0; j < 101; j++)
{
dp[i][j] = new Array(101);
for (let k = 0; k < 101; k++)
{
dp[i][j][k] = 0;
}
}
}
function solve(arr, l, r, k)
{
if (r - l + 1 <= k)
return sum(arr, l, r);
if (dp[l][r][k] != 0)
return dp[l][r][k];
let sum_ = sum(arr, l, r);
let len_r = (r - l + 1) - k;
let len = (r - l + 1);
let ans = 0;
for (let i = 0; i < len - len_r + 1; i++)
{
let sum_sub = sum(arr, i + l, i + l + len_r - 1);
ans = Math.max(ans, (sum_ - sum_sub) + (sum_sub -
solve(arr, i + l, i + l + len_r - 1, k)));
}
dp[l][r][k] = ans;
return ans;
}
let arr = [ 10, 15, 20, 9, 2, 5 ], k = 2;
let n = arr.length;
document.write(solve(arr, 0, n - 1, k));
</script>
|
Time Complexity: O(r2)
Auxiliary Space: O(101 * 101 * 101)
Last Updated :
24 Feb, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...