能量项链(noip2016)

简单的区间动规

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int maxn=105; 
 7 int n,f[maxn][maxn];
 8 struct xl{
 9     int l,r;
10 }neck[maxn*2];
11 
12 int main()
13 {
14     freopen("energy.in","r",stdin);
15     freopen("energy.out","w",stdout);
16     scanf("%d",&n);
17     scanf("%d",&neck[0].r);
18     for(int i=1;i<=n-1;i++)
19     {
20         neck[i].l=neck[i-1].r; 
21         scanf("%d",&neck[i].r);
22     }
23     neck[n].l=neck[n-1].r;
24     neck[n].r=neck[1].l;
25     //还有边界值还没有设置
26     for(int i=1;i<=n-1;i++)
27     {
28         neck[i+n].l=neck[i].l;
29         neck[i+n].r=neck[i].r;
30     }
31     for(int i=1;i<=n*2-1;i++) f[i][i]=0;
32     for(int l=1;l<=n;l++)
33         for(int i=1;i<=2*n-1;i++)
34         {
35             int j=i+l;f[i][j]=0;
36             if(j>=2*n) break;
37             for(int k=i;k<j;k++)
38                 f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+neck[i].l*neck[k+1].l*neck[j].r);        
39         }
40     int ansmax=0;
41     for(int i=1;i<=n;i++)
42         ansmax=max(ansmax,f[i][i+n-1]);
43     printf("%d",ansmax);
44 }

 

posted @ 2017-08-03 15:57  xinyimama  阅读(126)  评论(0编辑  收藏  举报