https://www.luogu.org/problemnew/show/P1063
区间dp:在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的 最优解进而得出整个大区间上最优解的dp算法。
核心思路
思路:求解在一个区间上的最优解,那么把这个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间即可。所以可以枚举区间长度 len 为每次分割成的小区间长度(由短到长不断合并),内层枚举该长度下可以的起点。然后从这个起点到终点之间枚举分割点,求解这段小区间在某个分割点下的最优解。
int n,a[410],dp[410][410];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
a[i+n]=a[i];//复制成环形
}
for(int len=2; len<=n; len++)//长度枚举
{
for(int l=1; l<=2*n-len+1; l++)//左端点
{
int r=l+len;
for(int k=l+1; k<=r-1; k++)//中转点(合并点)
{
dp[l][r]=max(dp[l][r],dp[l][k]+dp[k][r]+a[l]*a[k]*a[r]);
}
}
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dp[i][n+i]);
}
printf("%d\n",ans);
}