能量项链(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 }