f[i][j]表示第i~j个矩形相乘所得的最少乘法次数。
设a[i][j].x/y分别为第i~j个矩形连乘(最优方案)所得的x/y。
则可得状态转移方程:
f[i][j]=max(f[i][l]+f[l+1][j]+a[i][l].x*a[l+1][j].x*a[l+1][j].y);
(i<=l<=j)
值得注意的是,在状态更新之后,a[i][j]也应该被更新:
a[i][j].x=a[i][l].x;
a[i][j].y=a[l+1][j].y;
void init()
{
read(n);
for(int i=1;i<=n;++i) read(a[i][i].x),read(a[i][i].y);
}
void work()
{
memset(f,10,sizeof(f));
for(int i=1;i<=n;++i) f[i][i]=0;
for(int k=2;k<=n;++k)
for(int i=1;i<=n-k+1;++i)
{
int j=i+k-1;
for(int l=i;l<=j;++l)
{
if(f[i][j]>f[i][l]+f[l+1][j]+a[i][l].x*a[l+1][j].x*a[l+1][j].y)
{
f[i][j]=f[i][l]+f[l+1][j]+a[i][l].x*a[l+1][j].x*a[l+1][j].y;
a[i][j].x=a[i][l].x;
a[i][j].y=a[l+1][j].y;
}
}
}
printf("%lld",f[1][n]);
}
noip2006能量项链,与这题思路基本相同,但是需要断环为链,即储存两倍的珠子,枚举区间不变。