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;
}

 

posted @ 2023-04-10 10:16  董晓  阅读(330)  评论(0编辑  收藏  举报