[恩难到了]陨石的秘密
【描述】
公元19881231年,一顆巨大的隕石墜落在世界的政治文化中心cs。于是,災難降臨了,地球上出現了一系列反常的現象。當人們焦急萬分的時候,一支由cs科學家組成的考察隊趕到了出事地點。經過一番偵察,科學家們發現隕石上刻有若干行密文,每一行都包含5個整數:
?1 1 1 1 6
?0 0 6 3 57
?8 0 11 3 2845
著名的科學家yh發現,這些密文實際上是一種復雜運算的結果。為了便于大家理解這種運算,他定義了一種yh表達式:
1. yh表達式是僅由'{','}','[',']','(',')'組成的字符串。
2. 一個空串是yh表達式。
3. 如果A是yh表達式,且A中不含字符'{','}','[',']',則(A)是yh表達式。
4. 如果A是yh表達式,且A中不含字符'{','}',則[A]是yh表達式。
5. 如果A是yh表達式,則{A}是yh表達式。
6. 如果A和B都是yh表達式,則AB也是yh表達式。
例如 ?()(())[] , {()[()]}, {{[[(())]]}} 都是yh表達式。
而 ()([])() , [() 都不是SS表達式。
并且,我們定義,該串總的括號最大層數為該串的深度,例如(){()}[]的深度為2。
密文中的復雜運算是這樣進行的:
設密文中每行前4個數依次為L1,L2,L3,D,求出所有深度為D,含有L1對{},L2對[],L3對()的SS串的個數,并用這個數對數11380求余數,這個余數就是密文中每行的第5個數,我們稱之為神秘數。
密文中某些行的第五個數已經模糊不清,而這些數字正是揭開隕石秘密的鑰匙?,F在科學家們聘請你來計算這個神秘數。
【輸入格式】
共一行,4個整數L1,L2,L3,D。相鄰兩個數之間用一個空格分隔。
【輸出格式】
共一行,包含一個整數,即神秘數
【樣例輸入】
1 1 1 2
【樣例輸出】
8
【數據范圍】
L1,L2,L3<=10,D<=30。
【分析】
恩,很明白,不會……
然后搜題解,找到了BYD大牛。
于是看了題解,于是會了。囧。
以下引用BYD大牛的題解:
“容易看出是動態規劃,但是狀態轉移方程容易考慮不周全。
題目中樣例的8種方案為
{[]()} {()[]} {}[()] [()]{} []{()} {()}[] (){[]} {[]}() 可以看出每個SS表達式都可以看成由幾個小的SS組成,組成方式可能是嵌套或者連接。如果是嵌套(包括僅1層),我們把這個嵌套體看作一個整體部分,稱為一個組。則每個SS表達式都是由幾個組連接而成了。
設定 F[p1,p2,p3,d]為深度不超過d,包含p1個{},p2個[],p3個()的SS表達式的可能組成的方案數。S[p1,p2,p3,d]為深度不超過d,包含p1個{},p2個[],p3個()的一個組的可能組成的方案數。
則狀態轉移方程為
S[p1,p2,p3,d]={0 (p1==p2==p3==0)F[p1-1,p2,p3,d-1] (p1>=1)F[p1,p2-1,p3,d-1] (p1==0 && p2>=1)F[p1,p2,p3-1,d-1] (p1==0 && p2==0 && p3>=1)} F[p1,p2,p3,d]=Σ(S[x1,x2,x3,d]*F[p1-x1,p2-x2,p3-x3,d]) (0<=x1<=p1,0<=x2<=p2,0<=x3<=p3且x1,x2,x3不同時為0)
初始條件
- F[0,0,0,i]=1 (0<=i<=D)
最終的結果就是
- F[L1,L2,L3,D]-F[L1,L2,L3,D-1]”
#include <stdio.h>
#define maxn 35int f[maxn][maxn][maxn][maxn];
int l1,l2,l3,d,ans,base=11380;
int dp(int p1,int p2,int p3,int d);int s(int p1,int p2,int p3,int d)
{if (p1) return dp(p1-1,p2,p3,d-1);if (p2) return dp(p1,p2-1,p3,d-1);return dp(p1,p2,p3-1,d-1);
}int dp(int p1,int p2,int p3,int d)
{if (d<0) return 0;if (f[p1][p2][p3][d]==-1){f[p1][p2][p3][d]=0;for (int x1=0;x1<=p1;++x1)for (int x2=0;x2<=p2;++x2)for (int x3=0;x3<=p3;++x3){if (x1+x2+x3==0) continue;f[p1][p2][p3][d]+=(s(x1,x2,x3,d)*dp(p1-x1,p2-x2,p3-x3,d))%base;f[p1][p2][p3][d]%=base;}}return f[p1][p2][p3][d];
}int main()
{freopen("secret.in","r",stdin);freopen("secret.out","w",stdout);scanf("%d%d%d%d",&l1,&l2,&l3,&d);for (int i=0;i<=d;++i){for (int p1=0;p1<=l1;++p1)for (int p2=0;p2<=l2;++p2)for (int p3=0;p3<=l3;++p3)f[p1][p2][p3][i]=-1;f[0][0][0][i]=1;}ans=dp(l1,l2,l3,d)-dp(l1,l2,l3,d-1);ans=(ans+base)%base;printf("%d\n",ans);return 0;
} ?
?
?
轉載于:https://www.cnblogs.com/sephirothlee/archive/2010/09/25/1834775.html
總結
以上是生活随笔為你收集整理的[恩难到了]陨石的秘密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 想知道大众的审美,天涯ER进来帮帮我好吗
- 下一篇: 黄山风景区坐大巴到宏村是直接到景区吗