比较基础的区间DP
f[i][j]:从i到j这段区间进行删数
i:起始点
j:终止点
状态转移方程:
f[i][j]=max(f[j][k]+f[k+1][i+j-1]),max([j][i+j-1],abs(w[j]-w[i+j-1])*i))
f[j][k]+f[k+1][i+j-1]:枚举各种情况(删法)
abs(w[j]-w[i+j-1])*i:无法用其他状态更新的全删完
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int f[105][105],w[105],n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
for(int i=1;i<=n;i++)
f[i][i]=w[i];//自己到自己也就只能是自己
for(int i=2;i<=n;i++)
for(int j=1;j<=n-i+1;j++)
{
f[j][i+j-1]=abs(w[j]-w[i+j-1])*i;
for(int k=j;k<=j+i-2;k++)
f[j][i+j-1]=max(f[j][k]+f[k+1][i+j-1],f[j][i+j-1]);
}
cout<<f[1][n];
return 0;
}