给定一个由N个正整数组成的数组。我们可以从两端的任意一个中删除元素,即从数组的左侧或右侧删除元素。每次我们删除元素时,分数都会增加元素*的值(已删除元素的数量+ 1)。任务是找到可以通过删除所有元素获得的最大分数。
例子:
Input : arr[] = { 1, 3, 1, 5, 2 }.
Output : 43
Remove 1 from left side (score = 1*1 = 1)
then remove 2, score = 1 + 2*2 = 5
then remove 3, score = 5 + 3*3 = 14
then remove 1, score = 14 + 1*4 = 18
then remove 5, score = 18 + 5*5 = 43.
Input : arr[] = { 1, 2 }
Output : 5.
这个想法是使用动态编程。制作一个名为dp [] []的2D矩阵,该矩阵初始化为0,其中dp [i] [j]表示数组的索引ito索引j的最大分数。因此,我们的最终结果将存储在dp [0] [n-1]中。
现在,dp [i] [j]的值将为arr [i] *(已删除元素的数量+ 1)的最大值+ dp [i + 1] [j]或arr [j] *(已删除元素的数量) + 1)+ dp [i] [j – 1]。
以下是此方法的实现:
C++
// CPP program to find maximum score we can get
// by removing elements from either end.
#include
#define MAX 50
using namespace std;
int solve(int dp[][MAX], int a[], int low, int high,
int turn)
{
// If only one element left.
if (low == high)
return a[low] * turn;
// If already calculated, return the value.
if (dp[low][high] != 0)
return dp[low][high];
// Computing Maximum value when element at
// index i and index j is to be chosed.
dp[low][high] = max(a[low] * turn + solve(dp, a,
low + 1, high, turn + 1),
a[high] * turn + solve(dp, a,
low, high - 1, turn + 1));
return dp[low][high];
}
// Driven Program
int main()
{
int arr[] = { 1, 3, 1, 5, 2 };
int n = sizeof(arr) / sizeof(arr[0]);
int dp[MAX][MAX];
memset(dp, 0, sizeof(dp));
cout << solve(dp, arr, 0, n - 1, 1) << endl;
return 0;
}
Java
// Java program to find maximum score we can get
// by removing elements from either end.
public class GFG {
static final int MAX = 50;
static int solve(int dp[][], int a[], int low, int high,
int turn) {
// If only one element left.
if (low == high) {
return a[low] * turn;
}
// If already calculated, return the value.
if (dp[low][high] != 0) {
return dp[low][high];
}
// Computing Maximum value when element at
// index i and index j is to be chosed.
dp[low][high] = Math.max(a[low] * turn + solve(dp, a,
low + 1, high, turn + 1),
a[high] * turn + solve(dp, a,
low, high - 1, turn + 1));
return dp[low][high];
}
// Driven Program
public static void main(String args[]) {
int arr[] = {1, 3, 1, 5, 2};
int n = arr.length;
int dp[][] = new int[MAX][MAX];
System.out.println(solve(dp, arr, 0, n - 1, 1));
}
}
/*This code is contributed by 29AjayKumar*/
Python 3
# Python 3 program to find maximum
# score we can get by removing
# elements from either end.
MAX = 50
def solve(dp, a, low, high, turn):
# If only one element left.
if (low == high):
return a[low] * turn
# If already calculated,
# return the value.
if (dp[low][high] != 0):
return dp[low][high]
# Computing Maximum value when element
# at index i and index j is to be chosed.
dp[low][high] = max(a[low] * turn + solve(dp, a,
low + 1, high, turn + 1),
a[high] * turn + solve(dp, a,
low, high - 1, turn + 1));
return dp[low][high]
# Driver Code
if __name__ == "__main__":
arr = [ 1, 3, 1, 5, 2 ]
n = len(arr)
dp = [[0 for x in range(MAX)]
for y in range(MAX)]
print(solve(dp, arr, 0, n - 1, 1))
# This code is contributed by ChitraNayal
C#
// C# program to find maximum score we can get
// by removing elements from either end.
using System;
class GFG
{
static int MAX = 50;
static int solve(int[,] dp, int[] a, int low,
int high, int turn)
{
// If only one element left.
if (low == high)
return a[low] * turn;
// If already calculated, return the value.
if (dp[low, high] != 0)
return dp[low, high];
// Computing Maximum value when element at
// index i and index j is to be chosed.
dp[low,high] = Math.Max(a[low] * turn + solve(dp, a,
low + 1, high, turn + 1),
a[high] * turn + solve(dp, a,
low, high - 1, turn + 1));
return dp[low, high];
}
// Driven code
static void Main()
{
int[] arr = new int[]{ 1, 3, 1, 5, 2 };
int n = arr.Length;
int[,] dp = new int[MAX,MAX];
for(int i = 0; i < MAX; i++)
for(int j = 0; j < MAX; j++)
dp[i, j] = 0;
Console.Write(solve(dp, arr, 0, n - 1, 1));
}
}
// This code is contributed by DrRoot_
PHP
输出:
43