UOJ Logo heqingyu的博客

博客

洛谷P1063 题解

2017-10-12 12:28:07 By heqingyu

因为这是一种中链式dp,为了方便起见,将环状的项链平坦开呈链状,并且多加一次,这样可以找到所有情况

设f[i][j]为从i到j所能获得的最大值,因此从l枚举到r,求出最大值

scanf("%d",&n);

for(int i=1;i<=n;i++)scanf("%d",&a[i]),a[i+n]=a[i];//在末尾多加一段

for(int i=2;i<n*2;i++){//枚举末尾

    for(int j=1;j+i-1<2*n;j++){//枚举起点       

        int r=j+i-1;  

        for(int k=j;k<r;k++)//每个点都合并试试

        f[j][r]=max(f[j][r],f[j][k]+f[k+1][r]+a[j]*a[k+1]*a[r+1]);      

    }

}

for(int i=1;i<=n;i++)ans=max(ans,f[i][i+n-1]);//跑一遍求出最大值

printf("%d",ans);

return 0;

评论

暂无评论