删数
题目描述
有 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
#include <bits/stdc++.h>
using namespace std;
#define sf(x) scanf("%d",&x);
#define de(x) cout<<x<<" ";
#define Pu puts("");
typedef long long ll;
const int N=1e2+10;
int n,m,ans;
ll cz[N][N];
ll a[N];
void init(){
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
if(i==j) cz[i][j]=a[i];
else cz[i][j]=abs(a[i]-a[j])*(j-i+1);
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
sf(a[i])
}
init();
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
for(int k=i;k+1<=j;k++){
cz[i][j]=max(cz[i][j],cz[i][k]+cz[k+1][j]);
}
}
}
de(cz[1][n])
return 0;
}