用记忆话搜索做的,想不通为啥最后两个点会报错。我把一个数据下到本地跑报segment fault。
#define rep(i, a, n) for (long long i = a; i < n; ++i)
#define per(i, n, a) for (long long i = n - 1; i >= a; --i)
ll dp[105][105]={0};
// 存储每颗珠子的头部能量
int energy[205]={0};
ll dfs(int i,int j){
if(dp[i][j]) return dp[i][j];
if(i==j) return 0;
rep(k, i, j){
dp[i][j]=max(dp[i][j],dfs(i,k)+dfs(k+1,j)+energy[i]*energy[k+1]*energy[j+1]);
}
return dp[i][j];
}
int main(){
//std::ios::sync_with_stdio(false);
//std::cin.tie(0);
//freopen("INPUT.TXT", "r", stdin);
//freopen("OUTPUT.TXT", "w", stdout);
ll ans=0;
int N;
cin>>N;
rep(i, 0, N){
cin>>energy[i];
energy[N+i]=energy[i]; // 环展开成链
}
energy[2*N]=1;
rep(i, 0, N){
ans=max(ans,dfs(i,i+N-1));
}
cout<<ans;
return 0;
}
数据如下:
70
23 35 102 83 455 102 33 145 102 23 45 302 3 15 102 113 115 102 3 35 102 3 45 102 3 55 112 3 5 102 3 385 202 93 5 102 3 85 102 3 5 102 3 15 102 13 5 102 3 5 102 3 85 102 3 5 102 3 5 102 3 5 102 3 17 112 13 5 102 23