題目:
管道取珠是小x很喜歡的一款遊戲。在本題中,我們將考慮該遊戲的乙個簡單改版。遊戲畫面如圖1所示:
(圖1)
遊戲初始時,左側上下兩個管道分別有一定數量的小球(有深色球和淺色球兩種型別),而右側輸出管道為空。每一次操作,可以從左側選擇乙個管道,並將該管道中最右側的球推入右邊輸出管道。
例如:我們首先從下管道中移乙個球到輸出管道中,將得到圖2所示的情況。
(圖2)
假設上管道中有n個球, 下管道中有m個球,則整個遊戲過程需要進行n+m次操作,即將所有左側管道中的球移入輸出管道。最終n+m個球在輸出管道中從右到左形成輸出序列。
愛好數學的小x知道,他共有c(n+m,n)種不同的操作方式,而不同的操作方式可能導致相同的輸出序列。舉個例子,對於圖3所示的遊戲情形:
(圖3)
我們用a表示淺色球,b表示深色球。並設移動上管道右側球的操作為u,移動下管道右側球的操作為d,則共有c(2+1,1)=3種不同的操作方式,分別為uud,udu,duu;最終在輸出管道中形成的輸出序列(從右到左)分別為bab,bba,bba。可以發現後兩種操作方式將得到同樣的輸出序列。
假設最終可能產生的不同種類的輸出序列共有k種,其中:第i種輸出序列的產生方式(即不同的操作方式數目)有ai個。聰明的小x早已知道,
σai=c(n+m,n)
因此,小x希望計算得到:
σ(ai)^2
你能幫助他計算這個值麼?由於這個值可能很大,因此只需要輸出該值對1024523的取模即可(即除以1024523的餘數)。
說明:文中c(n+m,n)表示組合數。組合數c(a,b)等價於在a個不同的物品中選取b個的選取方案數。
輸入格式:
輸入檔案中的第一行為兩個整數n,m,分別表示上下兩個管道中球的數目。
第二行中為乙個ab字串,長度為n,表示上管道中從左到右球的型別。其中:a表示淺色球,b表示深色球。
第三行中為乙個ab字串,長度為m,表示下管道中的情形。
輸出格式:
輸出檔案中僅一行為乙個整數,即為 除以1024523的餘數。
輸入樣例#1: 複製
2 1abb輸出樣例#1: 複製
5【樣例說明】
樣例即為文中(圖3)。共有兩種不同的輸出序列形式,序列bab有1種產生方式,而序列bba有2種產生方式,因此答案為5。
【資料規模和約定】
對於30%的資料,滿足:m,n<=12;
對於100%的資料,滿足:m,n<=500。
果然noi的題就是比較噁心
我們。。。首先可以按照題目說的做法來一波暴力。
好了在noi上得了30分開不開心啊~。
暴力我就不演示了,我們是來研究dp的。。。。。。
首先,∑(ai^2)該怎麼處理。
這個地方就非常巧妙了。
假設一種輸出方案為a,能輸出的方案為ai,
那麼讓兩個人玩這個遊戲,取到相同的a,方案數不就是ai^2嗎。。。。。。
這步思路非常巧妙。
然後我們可以列出dp方程,
f[a1][a2][b1][b2]代表取的情況,a代表第乙個人,1、2代表上下。
然後由於a1+a2==b1+b2,我們可以省去一維。
然後dp轉移如下了,轉移的條件是顏色相同:
1dp然後我們欣喜地去交了,得了70分。。。。。。for (a1=0;a1<=n;++a1)15}
16 }
儘管我們壓掉了一維,但是空間還是炸了,這樣子只能再來一波玄學滾動了。。。
好的我們再交一次,結果得了10分。。。。。。
好了陣列別忘了清0。
好了終於a了。
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7const
int maxn=502;8
const
int mod=1024523;9
intn,m;
10char
a[maxn],b[maxn],c[maxn];
11int f[2
][maxn][maxn];
12int
a1,a2,b1,b2;
13int cur=0;14
void
trans()
18for (int i=1;i<=n;++i)
21for (int i=1;i<=m;++i)
24for (int i=1;i<=m;++i)27}
28int
main()
39for (b1=0;b1<=n;++b1)51}
52}53 printf("
%d",f[cur^1
][m][n]);
54return0;
55 }
P1758 NOI2009 管道取珠
分析 這道題的難點在於轉化。對於這道題,我們要求的東西就相當於有兩個人在分別取球,求取出兩個序列完全一樣的方案數。這樣轉化,問題就變得簡單多了。我們設f i j k l f i j k l f i j k l 為第乙個人在第乙個串裡去了i ii個,在第二個串裡取了j jj個,第二個人在第乙個串裡取了...
洛谷 P1963 NOI2009 變換序列
先 dalao部落格 建圖並沒有什麼難的,但是關鍵在於如何使字典序最小。乙個很顯然的想法是先求出乙個完美匹配,然後從x集合的第乙個元素開始,如果該元素匹配的較小的乙個,那麼繼續,如果是較小的乙個,那麼強制把它轉換成較小的乙個,然後在其之後,尋找增廣路,如果能找到的話,就修改,如果沒有,取消修改。然而...
洛谷 P4159 SCOI2009 迷路
如果邊權為 1 11,則是簡單的矩陣快速冪加速dp遞推方程,又因為邊權並不大,所以考慮拆點,新圖中邊權均為 1 11,將每個點暴力拆成相連的 9 99 個點,對於原先某條邊 u,v,w u,v,w u,v,w 可以轉化為 u uu 拆成的點中第 w ww 個連向 v vv 拆成的點中第 1 11 個...