zoukankan      html  css  js  c++  java
  • luogu 2308添加括号

    添加括号

    传送门

    题目大意

    现在要添上n-1对括号,加法运算依括号顺序进行,得到n-1个中间和,求出使中间和之和最小的添括号方法。

    这道题其实是一个很简单的区间dp,中间和的意思是括号里面的和,也就是说,一个括号就有一个中间和,然后求总的中间和。

    设dp[l][r]表示区间([l,r])内最大中间和是多少,然后dp方程也是一个很简单的入门级方程

    [dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+sum[r]-sum[l-1]) ]

    枚举到一个区间,表示把这个区间两端加上括号。

    然后到了这道题的关键部分,怎么输出在那个地方添加括号以及每一个中间和

    我们一步一步来说
    首先我们用到一个断点记录数组,记录区间([l,r])的最优值断点处

    1. 输出括号添加的序列,辅助数组lc[],rc[],然后递归改变两个辅助数组的值,然后输出括号序列
    2. 输出每一部分的中间和,因为由小到大,所以也是递归输出。
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int lc[50],rc[50],sum[50],n,a[50],dp[50][50],cirl[50][50];
    void Print(int l,int r) {
    	if(l==r)return;
    	++lc[l];
    	++rc[r];
    	Print(l,cirl[l][r]);
    	Print(cirl[l][r]+1,r);
    }
    void Prinf(int l,int r) {
    	if(l==r)return ;
    	Prinf(l,cirl[l][r]);
    	Prinf(cirl[l][r]+1,r);
    	cout << sum[r]-sum[l-1]<<' ';
    }
    int main() {
    	scanf("%d",&n);
    	memset(dp,127/3,sizeof(dp));
    	for(int i=1; i<=n; i++) {
    		scanf("%d",&a[i]);
    		dp[i][i]=0;
    		sum[i]=sum[i-1]+a[i];
    	}
    	for(int len=2; len<=n; len++)
    		for(int l=1,r=len+l-1; r<=n; l++,r++)
    			for(int k=l; k<=r; k++)
    				if(dp[l][r]>=dp[l][k]+dp[k+1][r]+sum[r]-sum[l-1]) {
    					dp[l][r]=dp[l][k]+dp[k+1][r]+sum[r]-sum[l-1];
    					cirl[l][r]=k;
    				}
    	Print(1,n);
    	for(int i=1; i<=n; i++) {
    		for(int j=1; j<=lc[i]; j++)
    			cout << "(";
    		cout << a[i];
    		for(int j=1; j<=rc[i]; j++)
    			cout << ")";
    		if(i!=n)cout << '+';
    	}
    	cout << endl;
    	cout << dp[1][n]<<endl;
    	Prinf(1,n);
            return 0;
    }
    
  • 相关阅读:
    Educational Codeforces Round 67 D. Subarray Sorting
    2019 Multi-University Training Contest 5
    Educational Codeforces Round 69 (Rated for Div. 2) E. Culture Code
    Educational Codeforces Round 69 D. Yet Another Subarray Problem
    2019牛客暑期多校训练第六场
    Educational Codeforces Round 68 E. Count The Rectangles
    2019牛客多校第五场题解
    2019 Multi-University Training Contest 3
    2019 Multi-University Training Contest 2
    [模板] 三维偏序
  • 原文地址:https://www.cnblogs.com/ifmyt/p/9660922.html
Copyright © 2011-2022 走看看