1 solutions

  • 1
    @ 2025-8-7 21:48:48
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int a[205]={};
    int dp[205][205]={};//dp[i][j]:从i开始,j结束的合并
    int ans=-0x3f3f3f3f;
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++) cin>>a[i];
    	for(int i=1;i<=n;i++) a[i+n]=a[i];//复制一边当环形 
    	for(int i=1;i<=n;i++) dp[i][i]=0;//合并同一颗没有意义 
    	a[n*2+1]=a[1];
    	for(int len=2;len<=n;len++){//枚举合并长度 
    		for(int l=1;l+len-1<=2*n;l++){//枚举左端点 
    			int r=l+len-1;//右端点 
    			dp[l][r]=0;
    			for(int k=l;k<r;k++){
    				int c=a[l]*a[k+1]*a[r+1];//合并花费 
    				dp[l][r]=max(dp[l][r],dp[l][k]+dp[k+1][r]+c);
    			}
    		}
    	}
    	for(int i=1;i<=n;i++){
    		int x=i+n-1;
    		ans=max(dp[i][x],ans);
    		//求每一种全部合并方案的能量最大值 
    	}
    	cout<<ans<<"\n";
    	return 0;
    }
    
    • 1

    Information

    ID
    150
    Time
    1000ms
    Memory
    512MiB
    Difficulty
    5
    Tags
    # Submissions
    24
    Accepted
    13
    Uploaded By