第一次做的时候方程是对的,但就是没有AC
f[l][r]=max{f[l][k]+f[k][r]+a[l]*a[k]*a[r]|l<k<r}
r=l+i,f[l][r]表示从l到r共r-l+1=i+1颗珠子聚合后可以获得的最大能量
翻了两篇题解发现,问题出在把环拆成链时没有把链再存一遍
还有就是在循环的时候第一个循环,i不是1n,而是2n+1因为打断的是中间的
方程变形:区间dp公式:f[i][j]=max{f[i][k]+f[k+1][j]+决策}
之前我套公式套傻了写成f[l][k]+f[k+1][r]+a[l]*a[k]*a[r]
*事实上k并不用+1,因为题意是说相邻两个珠子合并,k是第一个珠子的尾标记和第二个珠子的头标记,他们是同一个数字
AC代码:
#include<iostream>
using namespace std;
int n,ans,f[210][210],a[210];
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>a[i];
a[n+i]=a[i];
}
for(int i=2; i<=n+1; i++)//注意i的循环头尾
{
for(int l=1; l+i-1<=2*n;l++)//注意链是到2n
{
int r=l+i-1;
for(int k=l+1;k<=r-1;k++)//k位于lr之间
{
f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]);//套公式
ans=max(ans,f[l][r]);
}
}
}
cout<<ans;
return 0;
}