洛谷P1758 NOI2009 管道取珠

2022-05-31 04:36:12 字數 2672 閱讀 4273

題目:

管道取珠是小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轉移如下了,轉移的條件是顏色相同:

1

for (a1=0;a1<=n;++a1)15}

16 }

dp然後我們欣喜地去交了,得了70分。。。。。。

儘管我們壓掉了一維,但是空間還是炸了,這樣子只能再來一波玄學滾動了。。。

好的我們再交一次,結果得了10分。。。。。。

好了陣列別忘了清0。

好了終於a了。

1 #include2 #include3 #include4 #include5 #include6

using

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 }

view code

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 個...