top1编程
← 返回题目
题解

【入门】石子合并(2)

1 条题解

  • 0
    @ 2026-7-29 0:19:37
    #include<bits/stdc++.h>
    using namespace std;
    int n;
    int minn=INT_MAX;
    int maxx=INT_MIN;
    int a[805];
    int qz[805];
    int dp_maxx[805][805];
    int dp_minn[805][805];
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    	}
    	for(int i=1;i<=n;i++){
    		qz[i]=qz[i-1]+a[i];
    	}
    	for(int len=2;len<=n;len++){
    		for(int i=1;i+len-1<=n;i++){
    			int j=i+len-1;
    			dp_maxx[i][j]=INT_MIN;
    			dp_minn[i][j]=INT_MAX;
    			for(int k=i;k<j;k++){
    				dp_maxx[i][j]=max(dp_maxx[i][j],dp_maxx[i][k]+dp_maxx[k+1][j]+qz[j]-qz[i-1]);
    				dp_minn[i][j]=min(dp_minn[i][j],dp_minn[i][k]+dp_minn[k+1][j]+qz[j]-qz[i-1]);
    			}
    		}
    	}
    	cout<<dp_minn[1][n]<<"&#92;n"<<dp_maxx[1][n];
    	return 0;
    }
    
    • 1