标签:main memset space 卡特兰 eof zoj getchar 研究 最大
来自FallDream的博客,未经允许,请勿转载,谢谢。
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #define MN 300 using namespace std; inline int read() { int x = 0 , f = 1; char ch = getchar(); while(ch < ‘0‘ || ch > ‘9‘){ if(ch == ‘-‘) f = -1; ch = getchar();} while(ch >= ‘0‘ && ch <= ‘9‘){x = x * 10 + ch - ‘0‘;ch = getchar();} return x * f; } char st[MN+5][MN+5]; int n,len[MN+5],mn[MN+5],f[MN*MN+5],g[MN*MN+5],mx[MN+5],top=0,top2=0,ans=0; struct data{int x,l,len;}q[MN+5],q2[MN+5]; bool cmp(data x,data y){return x.x>y.x;} int main() { n=read(); memset(f,128,sizeof(f)); memset(g,128,sizeof(g)); for(int i=1;i<=n;++i) { scanf("%s",st[i]+1); for(int j=1;st[i][j];++j) len[i]+=st[i][j]==‘(‘?1:-1, mn[i]=min(mn[i],len[i]); for(int j=strlen(st[i]+1),k=0;j;--j) k+=st[i][j]==‘(‘?1:-1,mx[i]=max(mx[i],k); len[i]>=0?(q[++top]=(data){mn[i],len[i],strlen(st[i]+1)},0): (q2[++top2]=(data){-mx[i],-len[i],strlen(st[i]+1)},0); } sort(q+1,q+top+1,cmp); sort(q2+1,q2+top2+1,cmp); f[0]=g[0]=0; for(int i=1;i<=top;++i) for(int j=i*MN;j>=q[i].l-q[i].x;--j) f[j]=max(f[j],f[j-q[i].l]+q[i].len); for(int i=1;i<=top2;++i) for(int j=i*MN;j>=q2[i].l-q2[i].x;--j) g[j]=max(g[j],g[j-q2[i].l]+q2[i].len); for(int i=MN*MN;~i;--i) if(f[i]>=0&&g[i]>=0) ans=max(ans,f[i]+g[i]); cout<<ans; return 0; }
[bzoj4922]Karp-de-Chant Number
标签:main memset space 卡特兰 eof zoj getchar 研究 最大
原文地址:http://www.cnblogs.com/FallDream/p/bzoj4922.html