NC16670. [NOIP2006]能量项链
描述
输入描述
第一行是一个正整数N(4 ≤ N ≤ 100),表示项链上珠子的个数。
第二行是N个用空格隔开的正整数,所有的数均不超过1000。第i个数为第i颗珠子的头标记(1 ≤ i ≤ N),当 i < N 时,第i颗珠子的尾标记应该等于第i+1颗珠子的头标记。第N颗珠子的尾标记应该等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:将项链放到桌面上,不要出现交叉,随意指定第一颗珠子,然后按顺时针方向确定其他珠子的顺序。
输出描述
输出一行,是一个正整数E( E ≤ 2.1*109 ),为一个最优聚合顺序所释放的总能量。
示例1
输入:
4 2 3 5 10
输出:
710
C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 732K, 提交时间: 2019-09-21 10:18:00
#include <iostream> using namespace std; int dp[410][410],n,a[210]; int main() { cin>>n; int i,l,r,k,maxx=0; for(i=1;i<=n;i++) { cin>>a[i]; a[i+n]=a[i]; } for(i=2;i<=n+1;i++) { for(l=1;l+i-1<=2*n;l++) { r=l+i-1; for(k=l+1;k<=r-1;k++) dp[l][r]=max(dp[l][r],dp[l][k]+dp[k][r]+a[l]*a[k]*a[r]); } } for(i=1;i<=n;i++) maxx=max(maxx,dp[i][n+i]); cout<<maxx; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 8ms, 内存消耗: 520K, 提交时间: 2019-10-14 16:40:08
#include<bits/stdc++.h> using namespace std; int n,e[300],f[300][300],m=-1; int main() { cin>>n; for(int i=1;i<=n;i++) { cin>>e[i]; e[i+n]=e[i]; } for(int i=2;i<2*n;i++) for(int j=i-1;i-j<n&&j>=1;j--) { for(int k=j;k<i;k++) f[j][i]=max(f[j][i],f[j][k]+f[k+1][i]+e[j]*e[k+1]*e[i+1]); if(f[j][i]>m) m=f[j][i]; } cout<<m; return 0; }