题目
本题和石子合并有异曲同工之处
如果不懂 石子合并 请转入这里传送门
题意表明这是一个环形的区间dp
处理环的方法
将环任意取一位置断开,复制形成2倍长的链
设f[l][r]为将区间[l,r]里的珠子合并成一个的最优值。
再根据区间dp用小区间更新大区间的日常套路
即可得出本题的方程
for(int k=l;i<r;k++)
f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1];
上代码
#include<bits/stdc++.h>
using namespace std;
const int ll=220;//注意开两倍大小的数组(复制链)
int n,a[ll];
long long max(long a,long long b){
if(a>b) return a;
else return b;
}
long long f[ll][ll];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int len=2;len<=n;len++)
for(int l=1;l<=2*n-len;l++){
int r=l+len-1;
for(int k=l;k<r;k++)
f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1]);
}
long long ans=0;
for(int i=1;i<=n;i++)
ans=max(ans,f[i][i+n-1]);
cout<<ans;
return 0;
}