环状处理+区间dp得解,注意答案需要枚举判断出以哪一颗珠子开始最大。
状态转移方程为:
dp[j][i] = max(E[j]*E[k+1]*E[i+1]+dp[j][k]+dp[k+1][i],dp[j][i])
j是开始的一颗珠子,i是结束的一颗珠子。
相当于用k截开每两颗珠子计算最大区间值。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define din(x) scanf("%lf",&x)
#define dout(x) printf("%lf",x)
#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
#define out(x) printf("%d",x)
#define lout(x) printf("%lld",x)
#define sin(x) scanf("%s",x)
#define chin(x) scanf("%c",&x)
#define sout(x) printf("%s",x)
#define chout(x) printf("%c",x)
#define ko putchar(' ')
#define ex putchar('\n')
const int MAXN = 105;
int n;
int dp[MAXN*2][MAXN*2];
int E[MAXN*2];
int main()
{
in(n);
for(int i = 1;i <= n;i++)
{
in(E[i]);
E[i+n] = E[i];
}
E[0] = E[n];
for(int i = 1;i <= 2*n;i++)
{
for(int j = i;j >= 1 && j > i-n;j--)
{
for(int k = j;k < i;k++)
{
dp[j][i] = max(E[j]*E[k+1]*E[i+1]+dp[j][k]+dp[k+1][i],dp[j][i]);
}
}
}