#include<bits/stdc++.h>
using namespace std;
int a[105];
int dp[105][105];
int main()
{
int n;
cin>> n;
for (int i = 1;i <= n;i++){
cin >> a[i];
dp[i][i] = a[i];
}
for (int j = 2;j <= n;j++){
for (int i = j-1;i > 0;i--){
dp[i][j] = abs(a[i] - a[j])*(j-i+1);
for (int k = i;k < j;k++){
dp[i][j] = max(dp[i][j] , dp[i][k]+dp[k+1][j]);
}
}
}
cout <<dp[1][n];
return 0;
}
删数
题目描述
有 N N N 个不同的正整数 x 1 x_1 x1, x 2 x_2 x2, …, x N x_N xN 排成一排,我们可以从左边或右边去掉连续的 i i i ( 1 ≤ i ≤ n ) (1 \le i \le n) (1≤i≤n) 个数(只能从两边删除数),剩下 N − i N-i N−i 个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。
每次操作都有一个操作价值,比如现在要删除从
i
i
i 位置到
k
k
k 位置上的所有的数。操作价值为
∣
x
i
−
x
k
∣
×
(
k
−
i
+
1
)
|x_i-x_k| \times (k-i+1)
∣xi−xk∣×(k−i+1) ,如果只去掉一个数,操作价值为这个数的值。
问如何操作可以得到最大值,求操作的最大价值。
输入格式
第一行为一个正整数 N N N ;
第二行有 N N N 个用空格隔开的 N N N 个不同的正整数。
输出格式
一行,包含一个正整数,为操作的最大值
样例 #1
样例输入 #1
6
54 29 196 21 133 118
样例输出 #1
768
提示
【样例解释和说明】
说明,经过 3 3 3 次操作可以得到最大值,第一次去掉前面 3 3 3 个数: 54 54 54 、 29 29 29 、 196 196 196 ,操作价值为 426 426 426。第二次操作是在剩下的三个数 ( 21 , 133 , 118 ) (21,133,118) (21,133,118) 中去掉最后一个数 118 118 118,操作价值为 118 118 118。第三次操作去掉剩下的 2 2 2 个数: 21 21 21 和 133 133 133 ,操作价值为 224 224 224。操作总价值为 426 + 118 + 224 = 768 426+118+224=768 426+118+224=768 。
【数据范围】
3 ≤ N ≤ 100 3≤N≤100 3≤N≤100 , 1 ≤ x i ≤ 1000 1 \le x_i \le 1000 1≤xi≤1000