[bzoj4922]Karp-de-Chant Number
生活随笔
收集整理的這篇文章主要介紹了
[bzoj4922]Karp-de-Chant Number
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
來(lái)自FallDream的博客,未經(jīng)允許,請(qǐng)勿轉(zhuǎn)載,謝謝。
卡常數(shù)被稱為計(jì)算機(jī)算法競(jìng)賽之中最神奇的一類數(shù)字,主要特點(diǎn)集中于令人捉摸不透,有時(shí)候會(huì)讓水平很高的選手迷之超時(shí)。 普遍認(rèn)為卡常數(shù)是埃及人Qa'a及后人發(fā)現(xiàn)的常數(shù)。也可認(rèn)為是卡普雷卡爾(Kaprekar)常數(shù)的別稱。主要用于求解括號(hào)序列問(wèn)題。 據(jù)考證,卡(Qa'a)是古埃及第一王朝的最后一位法老。他發(fā)現(xiàn)并研究了一種常數(shù),后世以他的名字叫做卡常數(shù)。卡特蘭數(shù)的起源也是因?yàn)榭ǖ暮笕伺c特蘭克斯結(jié)婚,生下來(lái)的孩子就叫卡特蘭,而他只是發(fā)表了祖?zhèn)鞯募視?shū)而已。Sereja也是卡的后人,提出括號(hào)序列問(wèn)題,也是從家書(shū)里得到的資料。然而Sereja為了不讓這個(gè)秘密公開(kāi),于是隱瞞了這道題的真正做法。可是由于卡的后人不是各個(gè)都像卡特蘭一樣愛(ài)慕虛榮,這一算法也無(wú)法找到。“欲見(jiàn)賢人而不以其道,猶欲其入而閉之門也”。卡之常數(shù)的奧秘,需要以一顆誠(chéng)心去追尋。 現(xiàn)給定n個(gè)括號(hào)序列,你需要選擇若干序列,將它們按一定的順序從左往右拼接起來(lái),得到一個(gè)合法的括號(hào)序列。 顯然,這個(gè)問(wèn)題可以用卡常數(shù)解決,為了檢驗(yàn)?zāi)闶欠駮?huì)卡常數(shù),請(qǐng)寫(xiě)一個(gè)程序,計(jì)算可以得到的合法的括號(hào)序列的長(zhǎng)度的最大值。 n<=300? 合法的括號(hào)序列只要滿足前綴和都大等于0并且總和是0就行了。 預(yù)處理每個(gè)序列的和還有前綴最小值 合法的括號(hào)序列可以看成兩段接起來(lái),分別由和是正的 和 和是負(fù)的組成。 對(duì)于和是正的,按照前綴最小值排序之后背包dp 負(fù)的也同理,翻轉(zhuǎn)一下就是同樣的做法了。 復(fù)雜度n^3 #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; }
轉(zhuǎn)載于:https://www.cnblogs.com/FallDream/p/bzoj4922.html
總結(jié)
以上是生活随笔為你收集整理的[bzoj4922]Karp-de-Chant Number的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: windows系统切换目录方法
- 下一篇: ajax 上传读取excel