E30 区间DP 能量项链
视频链接:https://www.bilibili.com/video/BV19t4y1a7xF/
Luogu P1063 [NOIP2006 提高组] 能量项链
#include <iostream> #include <cstring> #include <algorithm> using namespace std; const int N=210; int n, a[N]; //a[i]为第i颗珠子的头标记 int f[N][N]; //f[i,j]表示合并[i,j]得到的能量最大值 int main(){ cin>>n; for(int i=1; i<=n; i++)cin>>a[i], a[i+n]=a[i]; for(int len=3; len<=n+1; len++) //区间长度 for(int i=1,j; (j=i+len-1)<=2*n; i++) //区间起点 for(int k=i+1 ;k<j; k++) //区间分割点 f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[i]*a[k]*a[j]); int res=0; for(int i=1;i<=n;i++)res=max(res,f[i][i+n]);//f[1,n+1]...f[n,2n] cout<<res<<endl; }