社区讨论

蒟蒻WA#2#8 80分求助

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lobcj942
此快照首次捕获于
2023/10/29 18:46
2 年前
此快照最后确认于
2023/11/04 00:31
2 年前
查看原帖
CPP
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>

using namespace std;

const int INF=0x3f3f3f3f;
const int MAXN=35;
int n;
int a[MAXN]={};
int sum[MAXN]={};
int dp[MAXN][MAXN]={};
int loc[MAXN][MAXN]={};
stack<int>s;

void output(int l,int r){
	int m=loc[l][r];
	cout<<"(";
	if(m==l)cout<<a[l];
	else output(l,m);
	cout<<"+";
	if(m+1==r)cout<<a[r];
	else output(m+1,r);
	cout<<")";
}

void pre(int l,int r){
	int m=loc[l][r];
	s.push(sum[r]-sum[l-1]);
	if(m+1<r)pre(m+1,r);
	if(m>l)pre(l,m);
}

int main(){
	cin>>n;
	memset(dp,INF,sizeof dp);
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum[i]=sum[i-1]+a[i];
	}
	for(int i=1;i<=n;i++)dp[i][i]=0;
	for(int len=2;len<=n;len++){
		for(int i=1,j=i+len-1;i<=n,j<=n;i++,j++){
			for(int k=i;k<j;k++){
				if(dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1]<dp[i][j]){
					loc[i][j]=k;
					dp[i][j]=dp[i][k]+dp[k+1][j]+sum[j]-sum[i-1];
				}
			}
		}
	}
	output(1,n);
	cout<<endl<<dp[1][n]<<endl;
	pre(1,n);
	while(!s.empty()){
		cout<<s.top()<<" ";
		s.pop();
	}
	return 0;
} 

回复

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

正在加载回复...