社区讨论

40pts WA求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mk834dc5
此快照首次捕获于
2026/01/10 17:10
2 个月前
此快照最后确认于
2026/01/13 16:45
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf = 1e9;

int n;
int m[303];
ll dp[1001][1001];
int b[303];
int updata[1001][1001];
set<int> s1;

int print(int l,int r){
	if(l >= r){
		printf("%d",m[l]);
		return m[l];
	}
	else{
		ll ans = 0;
		printf("(");
		ans += print(l,updata[l][r]);
		printf("+");
		ans += print(updata[l][r]+1,r);
		printf(")");
		s1.insert(ans);
		return ans;
	}
}

int main(){
	scanf("%d",&n);
	for(int i = 1;i <= n; ++i){
		scanf("%d",&m[i]);
		dp[i][i] = 0;
		b[i] = m[i] + b[i-1];
	}
	for(int l = 2;l <= n; ++l){//length
		for(int s = 1;s <= n - l + 1; ++s){//start
			int i = s,j = s + l - 1;//start and end
			dp[i][j] = inf; 
			for(int k = i;k < j; ++k){
				if(dp[i][j] > dp[i][k] + dp[k+1][j] + (b[j] - b[i-1])){
					dp[i][j] = dp[i][k] + dp[k+1][j] + (b[j] - b[i-1]);
					updata[i][j] = k;
				}
				
//				printf("%d %d %lld\n",i,j,dp[i][j]);
			}
		}
	}
	print(1,n);
	printf("\n");
	printf("%lld\n",dp[1][n]);
	for(int y : s1){
		printf("%d ",y);
	}
	return 0;
}

回复

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

正在加载回复...