题目
求操作的最大价值
分析
用区间型动态规划
f
[
i
]
[
j
]
=
m
a
x
(
f
[
i
]
[
j
]
,
f
[
i
]
[
k
]
+
f
[
k
+
1
]
[
j
]
)
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j])
i
<
=
k
<
j
i<=k<j
i<=k<j
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
using namespace std;
int f[101][101],n;
int in(){
int ans=0; char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=ans*10+c-48,c=getchar();
return ans;
}
int abs(int x){return (x<0)?-x:x;}
int main(){
n=in();
for (int i=1;i<=n;i++) f[i][i]=in();
for (int i=1;i<n;i++)
for (int j=i+1;j<=n;j++)
f[i][j]=abs(f[i][i]-f[j][j])*(j-i+1);//预处理
for (int j=2;j<=n;j++)
for (int i=j-1;i>=1;i--)
for (int k=i;k<j;k++)
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]);//区间型动态规划
printf("%d",f[1][n]);
return 0;
}