VIJOS 传送门 :​​1312​


状态:每个起点及相乘的个数

转换方程:

dp[i][k]=max(dp[i][k],dp[i][j]+dp[i+1+j][k-j-1]+dian[i].a*dian[i+j].b*dian[i+k].b);



代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node{
long long a,b;
}dian[300];
long long dp[300][120],shu[120];
int main()
{
int n;scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%lld",&shu[i]);
shu[n+1]=shu[1];
for (int i=1;i<=n;i++)
{
dian[i].a=shu[i];dian[i].b=shu[i+1];
dian[i+n]=dian[i];
}
memset(dp,0,sizeof(dp));
for (int k=1;k<n;k++)
{
for (int i=1;i<=n;i++)
{
for (int j=0;j<k;j++)
dp[i][k]=max(dp[i][k],dp[i][j]+dp[i+1+j][k-j-1]+dian[i].a*dian[i+j].b*dian[i+k].b);
}
for (int i=1;i<=n;i++)
dp[i+n][k]=dp[i][k];
}
long long ans=0;
for (int i=1;i<=n;i++)
ans=max(ans,dp[i][n-1]);
printf("%lld\n",ans);
return 0;
}