社区讨论

40 pts 求调

P2308添加括号参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mlhelhr4
此快照首次捕获于
2026/02/11 10:21
上周
此快照最后确认于
2026/02/11 10:31
上周
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1010;
int n,a[MAXN],dp[MAXN][MAXN],sum[MAXN];
vector<int> v;
string dfs(int l,int r){
	if(l == r) return string(1,a[l] + '0');
	for(int i = l;i < r;i++){
		if(dp[l][i] + dp[i + 1][r] + sum[r] - sum[l - 1] == dp[l][r]){
			v.push_back(sum[r] - sum[l - 1]);
			return '(' + dfs(l,i) + '+' + dfs(i + 1,r) + ')'; 
		}
	}
	return "";
}
int main(){
	cin >> n;
	memset(dp,0x3f3f3f3f,sizeof(dp));
	for(int i = 1;i <= n;i++){
		cin >> a[i];
		sum[i] = sum[i - 1] + a[i];
		dp[i][i] = 0;
	}
	for(int len = 2;len <= n;len++){
		for(int i = 1;i + len - 1 <= n;i++){
			int j = i + len - 1;
			for(int k = i;k < j;k++){
				dp[i][j] = min(dp[i][j],dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
			}
		}
	}
	string ans = dfs(1,n);
	cout << ans << endl;
	cout << dp[1][n] << endl;
	for(auto i = v.end() - 1;i >= v.begin();i--) cout << *i << " ";
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...