NC50499. 能量项链
描述
输入描述
第一行一个正整数n
第二行n个不超过1000的正整数,第个数为第i颗珠子的头标记,当时第i颗珠子的尾标记等于第i+1颗珠子的头标记,当i=n时第i颗珠子的尾标记等于第1颗珠子的头标记。
至于珠子的顺序,你可以这样确定:将项链放在桌面上,不要出现交叉,随机指定一颗珠子为第一颗珠子,按顺时针确定其它珠子的顺序。
输出描述
输出只有一行,一个不超过的正整数,表示最优聚合顺序所释放的能量。
示例1
输入:
4 2 3 5 10
输出:
710
C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 736K, 提交时间: 2019-08-25 12:45:48
#include <iostream> #include <cstring> #include <algorithm> using namespace std; int ans,n,i,j,t,k,head[205],f[205][205]; int main() { cin>>n; for(i=1;i<=n;i++) { cin>>head[i]; head[i+n]=head[i]; } memset(f,0,sizeof(f)); for(t=1;t<n;t++) for(i=1;i<=2*n-t;i++) { j=i+t; for(k=i;k<j;k++) f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+head[i]*head[k+1]*head[j+1]); } for(i=1;i<=n;i++) ans=max(ans,f[i][i+n-1]); cout<<ans<<endl; return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 6ms, 内存消耗: 1096K, 提交时间: 2019-09-17 20:59:25
#include<bits/stdc++.h> using namespace std; int n; int f[2001][2001]; int a[2001]; int main() { cin>>n; for(int i=0;i<n;i++) { cin>>a[i]; a[i+n]=a[i]; } int ans=-1; for(int l=2;l<=n;l++) { for(int i=0;i<2*n;i++) { int j=i+l; for(int k=i+1;k<j;k++) { f[i][j]=max(f[i][j],f[i][k]+f[k][j]+a[j]*a[i]*a[k]); ans=max(ans,f[i][j]); } } } cout<<ans<<endl; }