BZOJ 4922 Karp-de-Chant Number 动态规划
2017-06-20 16:27
387 查看
题目大意:给出一些括号序列,要求选择一些括号序列拼接成一个合法的括号序列,使得总长最大
套路大集合……
首先对于每个括号序列,把左边的左括号和右边的右括号对消,最后能得到一坨这样的东西:
))…))((…((
就是x个右括号然后y个左括号,记作(x,y)
然后考虑假如我们的子集选好了,我们要按照什么顺序拼接才能拼成一个合法的括号序列呢?
BZOJ3709
能拼必须满足当前左括号数≥x,拼完后左括号数+=y−x
显然先拼y≥x的,后拼y<x的
先考虑y≥x,显然拼了会使左括号数增大,那么能拼就拼,顺序是按照x从小到大
然后y<x,考虑倒着做,从后往前拼,能拼必须满足当前右括号数≥y,拼完后右括号数+=x−y,所以顺序是按照y从小到大,正过来就是从大到小
那么我们把所有的二元组按照上述顺序排序后,以左括号数作为空间跑一遍背包就行了
注意由于物品大小有正有负所以要讨论一下枚举顺序。。。
套路大集合……
首先对于每个括号序列,把左边的左括号和右边的右括号对消,最后能得到一坨这样的东西:
))…))((…((
就是x个右括号然后y个左括号,记作(x,y)
然后考虑假如我们的子集选好了,我们要按照什么顺序拼接才能拼成一个合法的括号序列呢?
BZOJ3709
能拼必须满足当前左括号数≥x,拼完后左括号数+=y−x
显然先拼y≥x的,后拼y<x的
先考虑y≥x,显然拼了会使左括号数增大,那么能拼就拼,顺序是按照x从小到大
然后y<x,考虑倒着做,从后往前拼,能拼必须满足当前右括号数≥y,拼完后右括号数+=x−y,所以顺序是按照y从小到大,正过来就是从大到小
那么我们把所有的二元组按照上述顺序排序后,以左括号数作为空间跑一遍背包就行了
注意由于物品大小有正有负所以要讨论一下枚举顺序。。。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define M 340 using namespace std; struct abcd { int limit1,limit2,reward,length; friend bool operator < (const abcd &x,const abcd &y) { if(x.reward>=0 && y.reward<0) return true; if(x.reward<0 && y.reward>=0) return false; if(x.reward>=0 && y.reward>=0) return x.limit1<y.limit1; return x.limit2>y.limit2; } }a[M]; int n,sum; int f[M*M]; int main() { char s[M]; memset(f,0xef,sizeof f); f[0]=0; cin>>n; for(int i=1;i<=n;i++) { int x=0,y=0; scanf("%s",s); for(int j=0;s[j];j++) { if(s[j]=='(') y++; else y?y--:x++; } a[i].limit1=x; a[i].limit2=y; a[i].reward=y-x; a[i].length=strlen(s); sum+=y; } sort(a+1,a+n+1); //for(int i=1;i<=n;i++) // cout<<a[i].limit1<<' '<<a[i].limit2<<' '<<a[i].reward<<' '<<a[i].length<<endl; for(int i=1;i<=n;i++) { if(a[i].reward<0) for(int j=a[i].limit1;j<=sum;j++) f[j+a[i].reward]=max(f[j+a[i].reward],f[j]+a[i].length); else for(int j=sum;j>=a[i].limit1;j--) f[j+a[i].reward]=max(f[j+a[i].reward],f[j]+a[i].length); } cout<<f[0]<<endl; return 0; }
相关文章推荐
- 【BZOJ4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+动态规划
- bzoj4922 Karp-de-Chant Number 动态规划+贪心
- [BZOJ]4922: Karp-de-Chant Number DP
- [bzoj4922]Karp-de-Chant Number
- bzoj4922-Karp-de-Chant Number
- BZOJ 4922 Karp-de-Chant Number 贪心+动态规划
- 【bzoj4922】[Lydsy六月月赛]Karp-de-Chant Number 贪心+背包dp
- 【BZOJ1672】[Usaco2005 Dec]Cleaning Shifts 清理牛棚 动态规划
- 【动态规划】【最短路】[BZOJ 1003]物流运输trans
- [BZOJ1040][ZJOI2008]骑士-基环树-动态规划
- bzoj3275 Number
- [BZOJ 1012] JSOI 2008 最大数maxnumber · 线段树
- BZOJ 1084 SCOI2005 最大子矩阵 动态规划
- 【动态规划】【记忆化搜索】【dfs】bzoj2748 [HAOI2012]音量调节
- 【BZOJ 1012】 [JSOI2008]最大数maxnumber
- 【动态规划17】bzoj3675 [Apio2014]序列分割(斜率优化)
- [BZOJ4589]Hard Nim-快速沃尔什变换-动态规划
- 【单调栈】Bzoj 1012: 最大数maxnumber
- bzoj1012 最大数maxnumber
- BZOJ 1270 Beijing Wc 2008 雷涛的小猫 动态规划