1 solutions

  • 0
    @ 2025-3-3 16:24:08

    C++ :

    #include <bits/stdc++.h>
    using namespace std;
    const int N = 210;
    int n;
    int a[N];//a存储珠子的头标记
    //dp[l][r]:合并lr得到的最大值
    int dp[N][N];
     
    int main() {
    	cin>>n;
    	for(int i = 1;i <= n;i++){
    		cin>>a[i]; 
    		a[i+n] = a[i];//将区间复制 
    	}	
    	
    	//状态计算
    	//阶段:穷举区间长度 
    	for(int len = 3;len <= n + 1;len++){
    		//状态:穷举区间的起点
    		for(int l = 1;l + len - 1 <= 2 * n;l++){
    			//区间终点
    			int r = l + len - 1; 
    			//决策:穷举分割点
    			for(int k = l+1;k < r;k++){
    				dp[l][r] = max(dp[l][r],dp[l][k]+dp[k][r]+a[l]*a[k]*a[r]);
    			} 
    		} 
    	}	
    	
    	//求结果
    	int r = 0;
    	for(int i = 1;i <= n;i++){
    		r = max(r,dp[i][i+n]);//dp[1,n+1] dp[2,n+2]... dp[n,2*n]
    	} 
    	cout<<r;
    	return 0;
    }
    
    • 1

    Information

    ID
    10001
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By