洛谷P1063

因为这是一种中链式dp,为了方便起见,将环状的项链平坦开呈链状,并且在末尾在延续一段,这样可以找到所有可能的相连情况

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

#include<bits/stdc++.h>

using namespace std;
int n,f[210][210],a[110],ans;

int main(){
  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; }

 

posted @ 2017-10-17 16:44  Accelerator-D-x  阅读(284)  评论(0编辑  收藏  举报