https://www.luogu.org/problemnew/show/P1063
合并珠子即合并左珠dp[i][k]和右珠dp[k+1][j],释放能量a[i]*a[k+1]*a[j+1](注意a[i]存放的是第i颗珠子的头标记,所以a[k+1]才是第k个珠子的尾标记)
-
- 设f[j][i] f[j][i]f[j][i]为合并[j,i] [j,i][j,i]能获得的最大能量值,那么很明显可以枚举一个k(j≤k<i),那么就有
f[j][i]=max(f[j][i],f[j][k]+f[k+1][i]+a[j]×a[k+1]×a[i+1])
即左边合并的最大值+右边合并的最大值+本次合并的能量 答案为max(f[1][n],f[2][n+1],f[3][n+2]......f[n][2×n−1])
#include<bits/stdc++.h>
using namespace std;
int n,i,a[1000],l,j,k,dp[1000][10000],ans;
int main()
{
scanf("%d",&n);
for(i=1; i<=n; i++){
scanf("%d",&a[i]);
a[i+n]=a[i];
}
for(l=2; l<=n; l++)
for(i=1; i<n*2; i++){
j=i+l-1;
if (j>n*2)
break;
for(k=i; k<j; k++)
dp[i][j]=max(dp[i][j],
dp[i][k]+dp[k+1][j]+a[i]*a[k+1]*a[j+1]);
}
for(i=1; i<=n; i++)
ans=max(dp[i][i+n-1],ans);
printf("%d\n",ans);
}