5 条题解

  • 0
    @ 2025-12-14 11:25:27
    #include<iostream>
    using namespace std;
    const int MAXN = 210;
    const int INF = 114514;
    int n,a[MAXN],b[MAXN];
    int dp1[MAXN][MAXN];
    int dp[MAXN][MAXN];
    int maxx = -INF;
    int minn = INF;
    int pre[MAXN];
    int main() {
    	cin >> n;
    	for (int i = 0;i < n;i++) {
    		cin >> a[i];
    	}
    	for (int i = 0;i < 2 * n;i++) {
    		b[i] = a[i % n];
    	}
    	for (int i = 0;i < 2 * n;i++) {
    		pre[i + 1] = pre[i] + b[i];
    	}
    	for (int i = 0;i < 2 * n;i++) {
    		for (int j = 0;j < 2 * n;j++) {
    			dp[i][j] = INF;
    			dp1[i][j] = -INF;
    		}
    		dp[i][i] = 0;
    		dp1[i][i] = 0;
    	}
    	for (int len = 2;len <= n;len++) {
    		for (int i = 0;i + len - 1 < 2 * n;i++) {
    			int j = i + len - 1;
    			int ij = pre[j + 1] - pre[i];
    			for (int k = i;k < j;k++) {
    				if (dp[i][k] != INF && dp[k + 1][j] != INF) {
    					dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + ij);
    				}
    				if (dp1[i][k] != -INF && dp1[k + 1][j] != -INF) {
    					dp1[i][j] = max(dp1[i][j],dp1[i][k] + dp1[k + 1][j] + ij);
    				}
    			}
    		}
    	}
    	for (int i = 0;i < n;i++) {
    		minn = min(minn,dp[i][i + n - 1]);
    		maxx = max(maxx,dp1[i][i + n - 1]);
    	}
    	cout << minn << endl;
    	cout << maxx << endl;
    	return 0;
    }
    

    信息

    ID
    1639
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    235
    已通过
    96
    上传者